1

Я пытаюсь использовать find и ls для сортировки файлов по дате, однако ничего не делает. Вот моя команда:

find ./.BUBackups -name "test*" -exec ls -t {} \;

Я также попробовал:

find ./.BUBackups -name "test*" -exec ls -lt {} \;

В тестировании -t просто ничего не делает. -l работает, но если я введу -t, он будет действовать так, как будто я его вообще не вставил. Тем не менее, ls -t или ls -lt отлично работает, когда я не запускаю его через exec, другими словами, просто набрав ls -t, работает

Это глюк? или я что-то не так делаю?

2 ответа2

3

Причина, по которой -t не работает, заключается в том, что find выполняет ls один раз для каждого найденного файла в отдельности, поэтому выходные данные располагаются в том порядке, в котором они были найдены. Чтобы заставить его работать так, как вы ожидаете:

find ./.BUBackups -name "test*" -exec ls -lt {} +

или же

find ./.BUBackups -name "test*" -print0 | xargs -0 -exec ls -lt 
3

Аргумент -exec для поиска выполняет указанную команду один раз для каждого файла, который находит. Так что если у вас есть файлы test_a, test_b и test_c, ваша команда будет эквивалентна:

ls -lt test_a
ls -lt test_b
ls -lt test_c

Другими словами, каждый листинг выполняется независимо для каждого файла, поэтому файлы будут перечислены в любом порядке, в котором их находит, а не в порядке времени модификации, как указывает опция -t для ls.

То, что вы действительно хотите, это что-то вроде find ./.BUBackups -name 'test*' | xargs ls -lt , который с файлами примеров, которые я использовал выше, будет эквивалентен ls -lt test_a test_b test_c . Поскольку теперь вы используете один вызов ls для вывода списка всех интересующих вас файлов, он может расположить их в правильном порядке mtime.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .