Как я могу найти самый недавно измененный файл (ы)?

Согласно моему блогу, мое решение было установлено JAVA_OPTS с $ CATALINA_HOME /conf/tomcat7.conf, например:

# You can pass some parameters to java here if you wish to
#JAVA_OPTS="-Xminf0.1 -Xmaxf0.3"
JAVA_OPTS="-Xms512M -Xmx1024M -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=54.***.***.65"

И результат после перезапуска Tomcat был:

# ps aux | grep java
tomcat    1359 96.6 13.0 1887508 220732 ?      Sl   09:19   0:44 /usr/lib/jvm/jre/bin/java -Xms512M -Xmx1024M -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9090 -[...]

PS Не забудьте создать копию файлов конфигурации по умолчанию. Тогда grep -r JAVA_OPTS etc / * , чтобы найти его в # документация будет более полезной: -)

0
18.07.2018, 14:56
3 ответа

Несмотря на то, что вы пометили вопрос bashи ksh, с zshи квалификаторами glob:

print **/*.txt(.om[1,5])

печатает первые 5 простых файлов(.)с расширением .txt, упорядоченных по возрастанию времени модификации(om)

напр.

print **/*.txt(.om[1,5])
dir/file1.txt file2.txt dir/file.txt File1.txt File2.txt
3
28.01.2020, 02:31

Оболочка bash(и ряд других оболочек )имеют нестандартный -оператор проверки -nt. Этот оператор проверяет, является ли время модификации одного файла более новым, чем время модификации другого.

В bash,оператор -ntимеет временное разрешение в одну секунду. В ksh93можно использовать тот же оператор с разрешением менее -секунды. Приведенный ниже код совместим с ksh93, за исключением того, что shopt -s globstarнеобходимо изменить на set -o globstar, где используется этот параметр.


Использование оператора проверки -ntдля файлов, соответствующих *.txtв текущем каталоге, для поиска самого нового обычного файла:

unset newest
for filename in./*.txt; do
    if [ -f "$filename" ] && [ "$filename" -nt "$newest" ]; then
        newest=$filename
    fi
done

или, немного короче,

unset newest
for filename in./*.txt; do
    [ -f "$filename" ] && [ "$filename" -nt "$newest" ] && newest=$filename
done

В конце цикла значение "$newest"будет именем последнего модифицированного обычного файла в текущем каталоге, который имеет суффикс имени файла .txt, при условии, что такие файлы вообще существовали (иначе переменная newestбыла бы не установлена ​​).

Оболочке dash, если она используется, потребуется отдельная проверка существования файла $newest, так как ее оператор -ntимеет несколько иную семантику, чем bashи ksh93:

.
unset newest
for filename in./*.txt; do
    if [ -f "$filename" ]; then
        if [ ! -f "$newest" ] || [ "$filename" -nt "$newest" ]; then
            newest=$filename
        fi
    fi
done

Чтобы сделать это рекурсивно с помощью bash, установите параметр оболочки globstarи используйте **для подстановки имен файлов:

shopt -s globstar
unset newest
for pathname in./**/*.txt; do
    if [ -f "$pathname" ] && [ "$pathname" -nt "$newest" ]; then
        newest=$pathname
    fi
done

Шаблон **соответствует точно так же, как *, но допускает сопоставление через /в путях.

Оболочка dashне поддерживает это.


Основываясь на предыдущем коде, чтобы получить пять последних измененных файлов:

shopt -s globstar
unset newest
for pathname in./**/*.txt; do
    if [ -f "$pathname" ]; then
        for (( i=0; i < 5; ++i )); do
            if [ "$pathname" -nt "${newest[$i]}" ]; then
                newest=( "${newest[@]:0:i}" "$pathname" "${newest[@]:i:4}" )
                break
            fi
        done
    fi
done

Единственная дополнительная вещь здесь состоит в том, что newestтеперь является массивом bash, и что мы, для каждого пути, который мы рассматриваем, должны просмотреть пять последних найденных «самых новых файлов», чтобы увидеть, где в массив, в который может поместиться этот новый файл.

Когда мы обнаружили, что файл действительно новее, чем один из других файлов в массиве, мы вставляем новый путь в массив и в то же время ограничиваем количество элементов в нем до пяти.

После завершения цикла массив newestбудет содержать пути пяти последних измененных обычных файлов, имеющих суффикс .txtимен файлов.Массив будет отсортирован по времени модификации с последним измененным файлом как ${newest[0]}.

1
28.01.2020, 02:31

Вы можете перечислить файлы по времени модификации (или созданию или доступу )с помощью ls.

просто скажи

ls -t *.txt | head -n5 

, чтобы получить последние 5 последних файлов.txt

Вы можете передать его в myutility с помощью $ ()или xargs.

ls -t *.txt | head -n5 | xargs myutility

Если вам нужна рекурсия, вы можете использовать find.

find -type f -iname "*.txt" | xargs ls -t | head -n5 | xargs myutility

(возможная проблема :у вас должен быть хотя бы один файл.txt, чтобы это работало. вы можете исправить это, но это самое чистое решение ).

РЕДАКТИРОВАТЬ :ОП хотела знать, как обрабатывать имена файлов с пробелами.Вот одно решение:

find -type f -iname "*.txt" | xargs ls -t | head -n5 | tr '\n' '\0' | xargs -0 myutility

Если вы хотите решить возможную проблему, упомянутую выше, вы можете проверить наличие файлов перед -с помощью find..... | egrep '.*' || exitили просто включить какое-то бессмысленное имя файла в ls и проигнорировать предупреждение вроде xargs ls -t ''.

2
28.01.2020, 02:31

Теги

Похожие вопросы