Как я могу получить список всех файлов в текущем каталоге вместе с датой их изменения и отсортировать по этой дате?
Теперь я знаю, как этого добиться find
, stat
и sort
, но по какой-то странной причине stat
он не установлен на коробке, и вряд ли я смогу его установить.
Любой другой вариант?
PS: gcc
тоже не установлен
find
-printf
Действие , кажется, самый простой , хотя.Ответы:
Мой самый короткий метод использует zsh:
(добавьте
D
квалификаторы glob, если вы также хотите перечислить скрытые файлы или файлы в скрытых каталогах).Если у вас есть GNU find, заставьте его распечатать время изменения файла и отсортировать по нему. Я предполагаю, что в именах файлов нет новых строк.
Если у вас есть Perl (опять же, при условии отсутствия новых строк в именах файлов):
Если у вас есть Python (опять же, при условии отсутствия новых строк в именах файлов):
Если у вас есть SSH-доступ к этому серверу, смонтируйте каталог через sshfs на лучше оборудованной машине:
Только с инструментами POSIX это намного сложнее, потому что нет хорошего способа найти время модификации файла. Единственный стандартный способ получить время файла -
ls
выходной формат зависит от локали и его сложно проанализировать.Если вы можете писать в файлы, и вам нужны только обычные файлы, а в именах файлов нет новых строк, вот вам ужасный шаг: создайте жесткие ссылки на все файлы в одном каталоге и отсортируйте их по времени изменения.
источник
find . -print | xargs -n99999 -s999999 ls -ltr
. Но в этом есть проблема, заключающаяся в том, что (1)xargs
может не разрешать-m
больше 512 или-s
больше 5120, и (b), даже если вы можете обойти это, все еще существует максимальный размер, наложенный ядром, для комбинированного списка аргументов и среды. Большинство ваших идей (кроме Perl и Python) имеют одну и ту же проблему, поэтому я специально избегал создания длинных командных строк.zsh
рекурсивных глобусов в общем случае.print -rl **/*
, единственным ограничением является количество свободной памяти), и помимо этогоzargs
. Ваше предложениеfind … | xargs … ls
будет отсортировано правильно, еслиxargs
вызов будет выполненls
только один раз, и не будет работать, если в именах файлов есть специальные символы.Предполагая, что GNU
find
:Измените
1n,1
на,1nr,1
если хотите, чтобы файлы, перечисленные в списке самых последних, были первымиЕсли у вас нет GNU,
find
это становится более сложным, посколькуls
формат меток времени сильно варьируется (например, недавно измененные файлы имеют другой стиль меток времени).источник
ls --time-style="..."
- я не уверен, является ли это стандартным или GNU ls, скорее всего, GNU.ls
не имеет этой опции.На Mac нет аргумента -printf для поиска, но вы можете сделать это вместо этого:
find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'
источник
это можно попробовать (хотя самому нужно создать) https://github.com/shadkam/recentmost
источник
Игнорирование скрытых файлов - с хорошей и быстрой отметкой времени
Хорошо обрабатывает пробелы в именах файлов - не то чтобы вы их использовали!
Больше в
find
изобилии можно найти, перейдя по ссылке.источник
Говоря в общем о поиске файлов по дате (это не сработает для оригинального постера, но я попал сюда, так что я подумал, что другие тоже могут). В моем случае я хочу перечислить файлы с целью их просмотра перед удалением.
С findutils 4.6.0 мне нравится:
Приведенная выше команда находит файлы (
-type f
) в текущем рабочем каталоге (.
), которые были изменены более 270 дней назад (-mtime +270
также-mtime 0
выдаст последние 24 часа и-mtime -5
покажет последние 5 дней). Затем он используетls
для их перечисления по дате, сначала самое новое (-exec ls -laFGht --time-style=iso {} \+
)Вот пример вывода:
Самое замечательное в этом то, что после того, как список был просмотрен, заменить часть списка на
find
команду delete просто:источник