Copie os primeiros n arquivos em um diretório diferente [duplicado]

25

É possível copiar apenas os primeiros 1000 arquivos de um diretório para outro?

Obrigado antecipadamente

    
por chchrist 16.01.2012 / 13:08

3 respostas

44

O seguinte copia os primeiros 1000 arquivos encontrados no diretório atual para $destdir . Embora os arquivos reais dependam da saída retornada por find .

$ find . -maxdepth 1 -type f |head -1000|xargs cp -t "$destdir"

Você precisará da implementação GNU de cp para -t , um find compatível com GNU para -maxdepth . Observe também que ele pressupõe que os caminhos de arquivo não contêm espaços em branco, novas linhas, aspas ou barras invertidas (ou caracteres inválidos ou com mais de 255 bytes com algumas xargs implementações).

EDITAR: Para lidar com nomes de arquivos com espaços, novas linhas, cotações, etc, você pode querer usar linhas terminadas com nulo (assumindo uma versão de head que possui a opção -z ):

find . -maxdepth 1 -type f -print0 | head -z -n 1000 | xargs -0 -r -- cp -t "$destdir" --
    
por 16.01.2012 / 14:22
2

Uma solução shell pura (que chama cp várias vezes).

N=1000;
for i in "${srcdir}"/*; do
  [ "$((N--))" = 0 ] && break
  cp -t "${dstdir}" -- "$i"
done

Isso copia um número máximo de $N arquivos de $srcdir para $dstdir . Os arquivos que começam com um ponto são omitidos. (E, tanto quanto sei, não há garantia de que o conjunto de arquivos escolhidos seria determinista).

    
por 16.01.2012 / 14:01
0

O seguinte 1-liner assustador:

perl -MFile::Copy -e 'opendir(DIR,$ARGV[0]);$n=1000; (-f $_) && copy($_,"$ARGV[1]/$_") while($n-- && readdir(DIR)) 

funciona para arquivos contendo espaços, cotações, etc., que tendem a quebrar soluções baseadas em shell (menores que contorções $ IFS). Claro, se os seus nomes de arquivos são comportados, o shell é bom.

Editar: seleção adicionada para copiar apenas arquivos.

    
por 16.01.2012 / 15:11

Tags