2

Я хочу переместить последние 3 измененных файла из каталога с помощью команд bash. Однако я заметил, что могу использовать find следующим образом:

find . -type f -mtime -0.5 -print -exec mv {} /home/user/Desktop \;

Но я не понял, как сделать то же самое с ls -tr | tail -n 3 . Например, это не работает:

ls -tr | tail -n 3 -exec mv {} /home/user/Desktop             
tail: invalid option -- 'e'

Единственная причина, по которой я предпочел бы использовать второй вариант, заключается в том, чтобы указать количество файлов вместо приблизительного времени. Можно ли заставить его работать с ls и tail

Спасибо!

2 ответа2

3

Командой , которую вы ищете, является xargs , поскольку tail не имеет встроенной способности выполнять программу.

Полная команда будет:

ls -tr | tail -n 3 | xargs -I{} mv {} /home/user/Desktop

Разбивая это:

  • ls -tr список файлов, отсортированных по дате / времени изменения (-t). Самые последние являются первыми по умолчанию; он переворачивается (последние измененные файлы в последнюю очередь), если вы добавляете -r
  • tail -n 3 фильтрует его до последних трех записей.
  • xargs -I{} mv {} /home/user/Desktop запускает mv {} /home/user/Desktop для каждой строки, получаемой из tail . Обратите внимание, что {} заменяется выводом из tail .

Обратите внимание, что вам может понадобиться убрать фигурные скобки в вызове xargs .

xargs -I\{\} mv \{\} /home/user/Desktop
1

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

mv *(.om[1,3]) ${somewhere}

«Волшебство» находится между двумя скобками после *:

  • . выбирает только простые файлы;
  • om сортирует результаты glob по mtime;
  • [1,3] выбирает первые три результата

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

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