Получить имена файлов, отсортированные по mtime - PullRequest
0 голосов
/ 10 февраля 2019

Как получить имена файлов, отсортированные по убыванию отметки времени модификации?

Я должен добавить, что имена файлов могут содержать любой специальный символ, кроме \0.

Вот что я получил такдалеко.Цикл, который получает имя файла и его mtime, однако он не отсортирован:

while IFS= read -r -d '' fname; do
  read -r -d '' mtime
done < <(find . -maxdepth 3 -printf '%p\0%T@\0')

Ответы [ 4 ]

0 голосов
/ 11 февраля 2019

Все, что вам нужно, это:

find . -maxdepth 3 -printf '%T@\t%p\0' | sort -zn

, и если после этого вы хотите получить только имя файла, оканчивающееся символом новой строки, то передайте его в awk, чтобы удалить метку времени и табуляцию, а также замените NUL новой строкой:

find . -maxdepth 3 -printf '%T@\t%p\0' | sort -zn | awk -v RS='\0' '{sub(/^[^\t]+\t/,"")}1'
0 голосов
/ 10 февраля 2019

Предполагая, что вам нужен список файлов и временных меток, упорядоченный по временной метке:

while IFS=: read mtime fname ; do
  echo "mtime = [$mtime] / fname = [$fname]"
done < <(find . -printf '%T@:%f\n' | sort -t:)

Я выбрал : в качестве разделителя, поскольку он довольно редко используется в качестве символа для ваших имен файлов,даже запрещено в DOS / NTFS

С такими строгими требованиями (имена файлов с : или \n в качестве возможных символов), чтобы получить то, что вам нужно, вы можете попробовать:

while IFS= read -r -d '' mtime; do 
   read -r -d '' fname; 
   echo "[$mtime][$fname]"; 
done < <(find . -maxdepth 3 -printf '%T@\0%p\0' ) | sort -nr

Попытка решить новые строки, встроенные в имена файлов:

while IFS= read -r -d '' mtime; do
     read -r -d '' fname;
     printf "[%s][%s]\0" "$mtime" "$fname"; 
done < <(find . -maxdepth 3 -printf '%T@\0%p\0' ) \
| sort -nrz | tr \\0 \\n
0 голосов
/ 11 февраля 2019

Если вы переупорядочите свой find printf, будет сортировка:

find . -maxdepth 3 -printf '%T@ :: %p\0'|\
sort -zrn |\
sed -z 's/^[0-9.]* :: //' |\
xargs -0 -n1 echo

Строки sed и xargs являются просто примерами удаления mtime и выполнения каких-либо действий с именами файлов.

0 голосов
/ 10 февраля 2019

Для файлов в одной и той же папке это будет делать:

$ ls -t

Если вы хотите пересечь дерево, один из них будет делать в зависимости от вашего варианта Linux (команда stat имеет разные синтаксисы):

$ найти.-type f -exec stat -c '% Y% n' {} \;|сортировать -nr |cut -d '' -f2-

Или:

$ найти.-type f -exec stat -f '% m% N' {} \;|сортировать -nr |cut -d '' -f2-

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...