Copiando os primeiros 1000 arquivos PDF com aspas duplas no nome para outra pasta

1

Estou com essa pasta com PDFs e preciso processar 1000 de cada vez. Então eu preciso movê-los para outra pasta, processá-los e excluí-los. Para isso eu tentei usar

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

Dá erro nas aspas simples e duplas no nome do arquivo. Existem milhares de arquivos e não tenho idéia de quantos deles têm essas citações.

Alguém pode me ajudar a encontrar uma solução?

E eu tentei com a opção -0 , não funcionou

    
por racer_ace 22.08.2014 / 10:08

2 respostas

0

Isso deve resolver o problema declarado:

shopt -s globstar
printf '%q
printf '%q\n' **/*.pdf | head -1000 | xargs cp -t $destdir
' **/*.pdf | xargs -0 -L 1000 cp -t $destdir

A primeira linha ativa a opção globstar para o bash, para que ** ofereça uma pesquisa recursiva. Uma vez que printf é um bash embutido no Ubuntu, ele não deve ter problemas com um grande número de arquivos.

O primeiro argumento dado a printf informa como formatar todos os outros argumentos. %q diz para escapar de tudo que possa causar problemas com \ - então foo bar'baz se tornará foo\ bar\'baz . O -print0 diz para inserir um caractere nulo após cada string entre aspas (equivalente a usar xargs em find), que pode ser separado por -0 da opção head . Se você precisar usar nomes delimitados por novas linhas - o que, eu acho, você faz, já que você precisará de uma combinação de tail e \n para fazer lotes de arquivos - então você deve usar find em vez de %code% :

find . -type f -exec your_script '{}' \+

Com tudo isso dito, talvez seja melhor você chamar seu script diretamente de %code% - então você não precisa se preocupar em escapar ou citar qualquer coisa:

shopt -s globstar
printf '%q
printf '%q\n' **/*.pdf | head -1000 | xargs cp -t $destdir
' **/*.pdf | xargs -0 -L 1000 cp -t $destdir
    
por evilsoup 25.08.2014 / 12:12
1

Use a opção -print0 e use este método para aplicar head nele:

find . -maxdepth 1 -type f -print0 | tr '
find . -maxdepth 1 -type f -print0 | tr '%pre%\n' \n%pre%' | 
    head -1000 | tr '%pre%\n' \n%pre%' | xargs --null cp -t $destdir
\n' \n%pre%' | head -1000 | tr '%pre%\n' \n%pre%' | xargs --null cp -t $destdir

Observe que xargs tem uma opção -L , que especifica quantos argumentos ele deve ler de uma só vez a partir da entrada. Assim, dependendo do processamento que você precisa fazer, você pode pular o head , escrever um script que receba 1000 argumentos ou até processar diretamente xargs .

    
por muru 22.08.2014 / 11:42

Tags