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

11

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

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

в каталоге svn у меня тоже есть много файлов .svn, которые я не хочу показывать в сортировке

Дэнни
источник
Я продемонстрировал, как исключить расширение из моего ответа.
mikeserv

Ответы:

18
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

n.st
источник
Могу ли я исключить расширение файла из папки ....
Дэнни
@ Дэнни Да, это легко найти find -not -iname '*.ext'.
n.st
найти -не -path " SVN " -не -name "* СВН" -printf "% TY-% tm-% Td% TT% р \ п" | сортировать -n это именно то, что мне нужно, большое спасибо @ n.st
Дэнни
5

Если вы хотите сгладить структуру каталогов (таким образом, сортируя по дате по всем файлам во всех каталогах, игнорируя, в каком каталоге они находятся), findрекомендуется использовать -approach, предложенный @yeti. Если вы хотите сохранить структуру каталогов, вы можете попробовать

$ ls -ltR /path/to/directory

который сортирует каталог на основе.

Андреас Визе
источник
1
это дает мне папку, где все, что мне нужно, это все вместе, что это недавно измененные файлы
Дэнни,
5

В bash беги shopt -s globstarпервым. В ksh93 запускай set -o globstarпервым. В zsh вы уже настроены.

ls -dltr **/*

Это вернет ошибку, если у вас так много файлов, что превышено ограничение длины командной строки в вашей системе. В zsh вы можете использовать это вместо:

print -rl -- **/*(Om)
Жиль "ТАК - перестань быть злым"
источник
Это единственный ответ, который работает для Solaris 10, спасибо! :)
Laxxy
3

Предполагая, что вы обычно используете GNU, попробуйте:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

источник
1
Вы можете использовать find«s -printfвозможность избежать вызова отдельного процесса (или несколько, в зависимости от количества файлов). Смотрите мой ответ для примера.
n.st
1
Зная, что есть другие способы сделать это, я хотел дать statшанс и показать -exec ... +. В самом деле! Иногда я думаю, statзаслуживает большего внимания ... и никто не должен брать рецепты отсюда, не читая об ингредиентах и ​​не думая о последствиях ...
Кстати ... не каждая находка имеет -printf...
1
@yeti - если у вас findего нет -printf, вы можете использовать -exec sh -c 'printf...'большую часть той же функциональности. Это также включает доступ к $(pwd)полностью определенным путям.
mikeserv
2
Я встречал много пользователей Linux, о которых никогда не читал stat. Поэтому иногда я просто хочу обратить внимание на stat... Я думаю, что statзаслуживает этого ...
2

Чтобы надежно перечислить имена файлов только с использованием последних инструментов GNU:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'
Graeme
источник
2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Это позволяет избежать проблем со списком аргументов, поскольку единственный аргумент, lsкоторый когда-либо получит, - это имя каталога, который вы хотите перечислить. Вы можете сделать это с чем угодно.

Оболочка просто как сценарий оболочки - это тот же процесс , и не имеет проблем , вы можете столкнуться при вызове.. sources|pipeexecve

В любом случае - вышеперечисленное идет только на три глубины, которые можно изменить, изменив maxdepth. Это также глубоко во-первых, так что вы работаете в обратном направлении в ваш текущий каталог из depth.

Вы можете заметить, что вы также получаете $LSCOLORS- на моей машине он также предоставляет аккуратно напечатанные столбцы и все остальное, что вы хотели бы ls- или, в этом отношении, все, что вы можете себе представить, что вы хотите сделать с. source.

НЕТ СВН

Опять же, это будет делать все, что вы ожидаете 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>&-

Лично мне это нравится с ls -sи, если хотите, -uбудет сортировать по времени доступа, а не по времени мода.

mikeserv
источник
1

В этом списке будет указан олл- files ин <dir>с самым старшим из самых старых модифицированных

find <dir> -type f -print0 | xargs -0 ls -ltr

И с этим последнее изменение является самым главным

find <dir> -type f -print0 | xargs -0 ls -lt

Обратите внимание, что это работает только в том случае, если список имен файлов не превышает предельное значение общей длины командной строки в вашей системе.

UNX
источник
правда, я забыл об этом
UnX
для справки о команде: слишком длинный список аргументов in-ulm.de/~mascheck/various/argmax
UnX
@ Жиль: Вы имеете xargs -0в виду (в обоих случаях).  xargs -print0эквивалентно xargs -p -r -i -n -t -0или xargs -inprt0или xargs -0ntrip, что, вероятно, не то, что вы имели в виду.
Скотт