Com [1] versões recentes do GNU findutils
e coreutils
:
find /home/jeremy/source -print0 |
tail -z -n 1000 |
xargs -0 -r mv -t /home/jeremy/dest/
As opções -print0
, -z
e -0
informam as três ferramentas para usar um caractere NUL como separador de nome de arquivo / registro. Isso torna seguro usar este pipeline com nomes de arquivos contendo QUALQUER caractere.
Se a sua versão de tail
(ou head
) não suportar a opção -z
, você poderá usar nova linha como delimitador de nome de arquivo (que será seguro para QUALQUER nome de arquivo, exceto os que contenham novas linhas):
find /home/jeremy/source |
tail -n 1000 |
xargs -r -d '\n' mv -t /home/jeremy/dest/
BTW, xargs
não é complicado. É um comando bastante simples que pega dados de stdin e os usa para rodar programas (com os dados de stdin usados como argumentos na linha de comando do programa). É uma ferramenta útil que vale bem a pequena quantidade de tempo necessária para aprender.
Mais importante, ao contrário de $(ls ...)
e similar, usar xargs
evita a maioria dos problemas com espaços, caracteres de globalização (curingas, etc) e outros caracteres irritantes (que são caracteres perfeitamente legítimos). em nomes de arquivos, então um roteiro bem escrito cuidará para não ser quebrado por eles).
[1] Eu não sei exatamente quando head
e tail
obtiveram -z
opções, mas nos últimos anos, muitas das ferramentas GNU (incluindo sort
) ganharam a capacidade de usar NUL como o separador de registro de entrada. Antes disso, eram apenas algumas ferramentas como find
e xargs
.
Isso é extremamente útil, pois agora você pode usar as opções -z
ou -Z
ou -0
etc para construir pipelines longos e complicados sem nunca perder essa útil separação NUL.