В последних [1] версиях GNU findutils
и coreutils
:
find /home/jeremy/source -print0 |
tail -z -n 1000 |
xargs -0 -r mv -t /home/jeremy/dest/
The -print0
, Параметры -z
и -0
указывают всем трем инструментам использовать символ NUL в качестве разделителя имени файла / записи. Это делает безопасным использование этого конвейера с именами файлов, содержащими ЛЮБОЙ символ.
Если ваша версия tail
(или head
) не поддерживает параметр -z
, вы можете использовать новую строку в качестве разделителя имени файла (что будет будьте осторожны для ЛЮБОГО имени файла, кроме тех, которые содержат символы новой строки):
find /home/jeremy/source |
tail -n 1000 |
xargs -r -d '\n' mv -t /home/jeremy/dest/
BTW, xargs
совсем не сложно. Это довольно простая команда, которая берет данные из стандартного ввода и использует их для запуска программ (при этом данные из стандартного ввода используются в качестве аргументов в командной строке этой программы). Это полезный инструмент, который стоит того небольшого количества времени, которое требуется для изучения.
Что еще более важно, в отличие от $ (ls ...)
и подобных, использование xargs
позволяет избежать большинства (все, если вы используете NUL в качестве разделителя) проблем с пробелами, подстановочными символами оболочки ( подстановочные знаки и т. д.) и другие раздражающие символы (которые являются вполне допустимыми символами в именах файлов, поэтому хорошо написанный сценарий позаботится о том, чтобы они не были нарушены).
[1] Я точно не знаю, когда head
и tail
получили параметры -z
, но за последние несколько лет многие инструменты GNU (включая sort
) получили возможность использовать NUL в качестве разделителя входных записей. До этого было всего несколько инструментов вроде find
и xargs
.
Это чрезвычайно полезно, так как теперь вы можете использовать эти параметры -z
или -Z
или -0
и т. Д. Для создания длинных сложных конвейеров без каких-либо необходимость потерять это полезное NUL-разделение.