Сортируйте файлы в каталоге рекурсивно на основе даты последнего изменения.

Вопрос или проблема

Отсортируйте файлы в директории рекурсивно по дате последнего изменения

Я изменил много файлов в своей директории и хочу узнать, какие это файлы, отсортировав их по дате последнего изменения, при этом я хочу исключить некоторые расширения

В директории 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

Заключение

Теперь, когда вы знаете, как сортировать файлы в директории по дате последнего изменения с исключением определенных расширений, вы сможете легко управлять своими файлами. Используйте приведенные выше команды в терминале вашей системы для выполнения необходимых операций. Это облегчит вам задачу выделения и управления измененными файлами в вашей файловой системе.

Оцените материал
Добавить комментарий

Капча загружается...