como mover conjunto de arquivos em uma linha [duplicado]

1

Eu queria mover 1000 arquivos em um diretório para outro diretório. Eu posso fazer isso se eu estiver no diretório original, mas se eu tentar isso

mv $(ls /home/jeremy/source|tail -1000) /home/jeremy/dest

de outro lugar, o caminho é removido e, portanto, eu precisaria acrescentar o caminho de alguma forma. Eu acho o $ conveniente e queria evitar xargs como parece complicado.

    
por jeremy_rutman 29.04.2016 / 14:11

2 respostas

1

Se o seu comando funcionasse se a linha de comando não se tornasse muito longa, então você pode usar (o complicado) xargs desta maneira:

 ls /home/jeremy/source | tail -1000 | xargs mv -t /home/jeremy/dest

Isso pressupõe que não há novas linhas e outros caracteres especiais nos nomes de arquivos (ou o caminho), caso contrário, o tail não funcionará corretamente e os xargs receberão nomes de arquivos divididos (conforme funciona nas linhas, a menos que você especifique xargs -0 ).

O argumento -t para mv permite que você especifique o diretório de destino antes dos argumentos do arquivo que precisam ser copiados para o destino.

    
por 29.04.2016 / 14:19
1

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.

    
por 29.04.2016 / 14:56