Операционная система: Linux
Тип файловой системы: ext3
Предпочтительное решение: bash (script / oneliner), ruby, python
У меня есть несколько каталогов с несколькими подкаталогами и файлами в них. Мне нужно составить список всех этих каталогов, который построен таким образом, чтобы каждый каталог первого уровня был указан рядом с датой и временем последнего созданного / измененного файла в нем.
Чтобы уточнить, если я касаюсь файла или изменяю его содержимое на несколько уровней подкаталогов вниз, эта временная метка должна отображаться рядом с именем каталога первого уровня. Скажем, у меня есть каталог, структурированный так:
./alfa/beta/gamma/example.txt
и я изменяю содержимое файла example.txt
, мне нужно, чтобы время отображалось рядом с каталогом первого уровня alfa
в удобочитаемой форме, а не в эпоху. Я пробовал некоторые вещи , используя находку, xargs
, sort
и любит , но я не могу обойти эту проблему , что файловая система Отметка «Альфа» не меняется , когда я создаю / изменять файлы на несколько уровней вниз.
источник
Ответы:
Попробуй это:
Выполните его, указав путь к каталогу, где он должен начать рекурсивное сканирование (он поддерживает имена файлов с пробелами).
Если файлов много, может пройти некоторое время, прежде чем они что-либо вернут. Производительность можно улучшить, если
xargs
вместо этого использовать :что немного быстрее
источник
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
это все еще удается быстро для меня.brew install coreutils
и использоватьgstat
вместоstat
stat
так какfind PATH -type f -printf "%T@ %p\n"| sort -nr
делает работу. Это тоже немного быстрее.find PATH -type f -exec stat -f "%m %N" "{}" \; | sort -nr | head
Чтобы найти все файлы, состояние файла которых было изменено в последний раз N минут назад:
find -cmin -N
например:
find -cmin -5
источник
sudo find -cmin -1 2>&1 |grep -v /proc/
В GNU Find (см.
man find
)-printf
Есть параметр для отображения файлов EPOC mtime и относительный путь.источник
tail
чтобы предотвратить вывод тысяч строк в выводе.awk '{print $2}'
кажется, что часть вызывает проблемы, когда есть имена файлов с пробелами. Вот решение, использующееsed
вместо этого, и оно также печатает время в дополнение к пути:find . -type f -printf '%T@ %Tc %P\n' | sort -n | tail | sed -r 's/^.{22}//'
touch "lala<Enter>b"
для создания такого файла. Я думаю, что дизайн утилит Unix имеет большой недостаток в имени файла.Я сократил удивительный ответ гало на эту однострочную
Обновлено : если в именах файлов есть пробелы, вы можете использовать эту модификацию
источник
IFS=$'\n'
В любом случае небезопасно при обработке имен файлов: Новые строки являются допустимыми символами в именах файлов в UNIX. Только символ NUL гарантированно не будет присутствовать в пути.Попробуй это
Он использует
find
для сбора всех файлов из каталога,ls
для их сортировки по дате изменения,head
для выбора 1-го файла и, наконец,stat
для отображения времени в хорошем формате.В настоящее время это небезопасно для файлов с пробелами или другими специальными символами в их именах. Напишите комментарий, если он еще не соответствует вашим потребностям.
источник
Эта команда работает в Mac OS X:
find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
В Linux, как и просил оригинальный постер, используйте
stat
вместоgstat
.Этот ответ, разумеется, является выдающимся решением user37078 , которое можно перевести с комментария на полный ответ. Я совмещал идеи CharlesB по использованию
gstat
в Mac OS X. Кстати, я получил coreutils от MacPorts, а не от homebrew .И вот как я упаковал это в простую команду
~/bin/ls-recent.sh
для повторного использования:источник
~/bin/ls-recent.sh
, тщательно ли вы проверили сценарий на наличие различий?find . -exec stat -f '%m%t%Sm %N' {} + | sort -n | cut -f2-
Решения Perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -no-stat-command-util .
Цитата из поста:
Perl:
Python:
источник
Игнорирование скрытых файлов - с хорошей и быстрой отметкой времени
Хорошо обрабатывает пробелы в именах файлов - не то чтобы вы их использовали!
Больше в
find
изобилии можно найти, перейдя по ссылке.источник
Я показываю это для последнего времени доступа, вы можете легко изменить это, чтобы сделать последнее время мода.
Есть два способа сделать это:
1) Если вы хотите избежать глобальной сортировки, которая может быть дорогой, если у вас есть десятки миллионов файлов, вы можете сделать следующее: (расположитесь в корне каталога, где вы хотите начать поиск)
Вышеупомянутый метод печатает имена файлов с прогрессивно более новым временем доступа, а последний напечатанный файл - это файл с самым последним временем доступа. Очевидно, что вы можете получить последнее время доступа, используя «хвост -1».
2) Вы можете найти рекурсивно распечатать имя, время доступа ко всем файлам в вашем подкаталоге, а затем отсортировать по времени доступа и хвосту самой большой записи:
И вот, у вас это есть ...
источник
У меня есть этот псевдоним в моем .profile, который я использую довольно часто
Таким образом, он делает то, что вы ищете (за исключением того, что он не изменяет дату / время на нескольких уровнях) - ищет последние файлы (в данном случае файлы * .log и * .trc); Кроме того, он находит только файлы, измененные в последний день, затем сортирует по времени и передает данные через less:
пс. Обратите внимание, что у меня нет root на некоторых серверах, но всегда есть sudo, поэтому вам может не понадобиться эта часть.
источник
Вы можете дать команду printf найти попытку
источник
Быстрая функция bash:
Найдите последний измененный файл в каталоге:
Вы также можете указать свой собственный формат даты / времени в качестве третьего аргумента.
источник
Далее возвращается строка метки времени и имя файла с самой последней меткой времени:
В результате к выводу формы:
<yy-mm-dd-hh-mm-ss.nanosec> <filename>
источник
Вот одна версия, которая работает с именами файлов, которые также могут содержать пробелы, символы новой строки, символы глобуса:
find ... -printf
печатает изменение файла (значение EPOCH), затем пробел и\0
завершенные имена файлов.sort -zk1nr
читает завершенные данные NUL и сортирует их численно в обратном порядкеПоскольку вопрос помечен Linux, я предполагаю, что
gnu
утилиты доступны.Вы можете передать выше с:
распечатать время изменения и имена файлов, отсортированные по времени изменения (самое последнее сначала), оканчивающемуся на новые строки.
источник
Вот что я использую (очень эффективно):
ПЛЮСЫ:
ПРИМЕНЕНИЕ:
где:
dir
- каталог для поиска [текущий каталог]number
- количество новейших файлов для отображения [10]Вывод для
find_last /etc 4
выглядит так:источник
Для простого
ls
вывода используйте это. Список аргументов отсутствует, поэтому он не может быть слишком длинным:И дополнено
cut
только датами, временем и именем:РЕДАКТИРОВАТЬ : Просто заметил, что текущий топ ответ сортируется по дате изменения. Это так же просто для второго примера, поскольку дата модификации указывается первой в каждой строке - добавьте сортировку в конец:
источник
Это также можно сделать с помощью рекурсивной функции в bash.
Пусть F функция, которая отображает время файла, которое должно быть лексикографически сортируемым гггг-мм-дд и т. Д., (Зависит от ОС?)
R рекурсивная функция, которая запускается через каталоги
И наконец
источник