Вопрос или проблема
Отсортируйте файлы в директории рекурсивно по дате последнего изменения
Я изменил много файлов в своей директории и хочу узнать, какие это файлы, отсортировав их по дате последнего изменения, при этом я хочу исключить некоторые расширения
В директории svn у меня тоже много файлов .svn, которые я не хочу отображать в сортировке
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n
Это даст вам что-то вроде
2014-03-31 04:10:54.8596422640 ./foo
2014-04-01 01:02:11.9635521720 ./bar
Если вы хотите упростить структуру директорий (то есть отсортировать по дате среди всех файлов во всех директориях, игнорируя, в какой директории находятся файлы), то подход с find
, предложенный @yeti, будет лучшим решением. Если вы хотите сохранить структуру директорий, вы можете попробовать
$ ls -ltR /path/to/directory
который сортирует по директории.
В альтернативном варианте, если вы хотите рекурсивный (-R
) список, и хотите, чтобы файлы перечислялись в обратном (-r
) порядке (т.е. от старейших к новейшим):
$ ls -ltrR /path/to/directory
В bash сначала выполните shopt -s globstar
. В ksh93 сначала выполните set -o globstar
. В zsh вы уже готовы.
ls -dltr **/*
Это вернет ошибку, если у вас слишком много файлов, что превышает лимит длины командной строки вашей системы. В zsh вы можете использовать это вместо:
print -rl -- **/*(Om)
Этот вариант будет перечислять все файлы
в <dir>
, при этом самым первым будет файл с самой ранней модификацией
find <dir> -type f -print0 | xargs -0 ls -ltr
А вот с этим самым новым файлом будет самым первым
find <dir> -type f -print0 | xargs -0 ls -lt
Обратите внимание, что это работает только если список имен файлов не превышает общий лимит длины командной строки вашей системы.
Предполагая, что вы используете GNU find, попробуйте:
find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n
Чтобы надежно перечислить только имена файлов, используя современные инструменты GNU:
find . -printf '%A@ %p\0' |
sort -nz |
sed -z 's/^[^ ]* //' |
tr '\0' '\n'
find $DIR -depth -maxdepth 3 \
-type d -readable -printf \
'printf "\\n%p\\n"
ls -t --color=always "%p"\n' |\
. /dev/stdin 2>&-
Это избегает любых проблем со списком аргументов, потому что единственным аргументом, который когда-либо получит ls
, будет имя директории, которую вы хотите перечислить. Вы можете делать это с чем угодно.
Оболочка просто . берет на себя
|pipe
как shell-скрипт – это тот же процесс и не имеет тех проблем, с которыми вы можете столкнуться при вызове execve
.
В любом случае – вышеупомянутое работает только на трех уровнях, что можно изменить, изменив maxdepth
. Это также осуществляет глубокую сортировку в первую очередь – так что вы продвигаетесь обратно к своей текущей директории с depth
.
Вы можете заметить, что вы также получаете $LSCOLORS
– на моем компьютере это также предоставляет аккуратно напечатанные колонки и все, что вы хотите от ls
– или, для этого matter, все, что вы можете представить, с чем вы хотите работать с . source.
БЕЗ SVN
Снова, это сделает все, что вы ожидаете от ls
. Поэтому скрытие .svn
файлов так же просто, как изменить строку ls
на:
ls -t --color=always --hide="*svn" "%p"\n
Или, если вы хотите видеть svn
расширения в каждой папке, кроме ./svn
, вы можете изменить так, чтобы вся команда выглядела так:
find $DIR -depth -maxdepth 3 \
-type d -readable -printf \
'printf "\\n%p\\n" ; hide=
[ "%p" = "./svn" ] && hide="*svn"
ls -t --color=always --hide="$hide" "%p"\n' |\
. /dev/stdin 2>&-
Лично мне нравится это с -s
от ls, и, если вам интересно, -u
будет сортировать по времени доступа вместо времени модификации.
Ответ или решение
Для сортировки файлов в директории рекурсивно по дате последнего изменения с исключением определенных расширений файлов, в том числе файлов с расширением .svn, можно воспользоваться командной строкой Unix/Linux и утилитами, такими как find
, sort
и ls
. Ниже приводится пошаговое руководство для достижения этой цели.
Шаг 1: Использование команды find
для поиска файлов
Команда find
позволяет вам искать файлы в директории и поддиректориях. При этом вы можете задать условия поиска, такие как тип файлов и их расширения. Для того чтобы исключить файлы с определенными расширениями, вы можете использовать параметр ! -name
.
Пример команды:
find /путь/к/директории -type f ! -name "*.svn" ! -name "*.имя_расширения" -printf "%T@ %p\n" | sort -n
Параметры этой команды:
/путь/к/директории
: Укажите путь к вашей директории.-type f
: Находит только файлы (не каталоги).! -name "*.svn"
: Исключает файлы с расширением .svn.-printf "%T@ %p\n"
: Выводит время последнего изменения в формате Unix timestamp и имя файла.| sort -n
: Сортирует результаты по времени последнего изменения (числовой сортировки по timestamp).
Шаг 2: Форматирование вывода
Если вы хотите выводить более читаемые даты, можно использовать stat
вместо -printf
. Пример:
find /путь/к/директории -type f ! -name "*.svn" -exec stat --format='%Y %n' {} + | sort -n
В этом случае:
-exec stat --format='%Y %n' {}
: Выполняет командуstat
для каждого файла, выводя время последнего изменения и имя файла.
Шаг 3: Исключение файлов из каталога .svn
Если у вас есть необходимость полностью игнорировать каталоги .svn
, вы можете дополнить команду, добавив исключение для этих каталогов:
find /путь/к/директории -type f ! -name "*.svn" ! -path "*/.svn/*" -printf "%T@ %p\n" | sort -n
Здесь ! -path "*/.svn/*"
исключает все файлы в любых подкаталогах .svn
.
Шаг 4: Сортировка и вывод по умолчанию
Если вам нужно вывести файлы по времени в разных случаях, вы можете использовать флаги сортировки:
- Для сортировки по новизне (от новых к старым):
find /путь/к/директории -type f ! -name "*.svn" -exec stat --format='%Y %n' {} + | sort -nr
- Для вывода от старых к новым:
find /путь/к/директории -type f ! -name "*.svn" -exec stat --format='%Y %n' {} + | sort -n
Заключение
Теперь, когда вы знаете, как сортировать файлы в директории по дате последнего изменения с исключением определенных расширений, вы сможете легко управлять своими файлами. Используйте приведенные выше команды в терминале вашей системы для выполнения необходимых операций. Это облегчит вам задачу выделения и управления измененными файлами в вашей файловой системе.