Como copiar recursivamente todos os arquivos pdf em um diretório (e seus subdiretórios) em um único diretório de saída?


20

Eu tenho um diretório que contém um grande número de arquivos PDF, alguns dos quais estão em subdiretórios (que podem estender várias camadas). Gostaria de mover todos os arquivos correspondentes *.pdfpara uma única pasta de saída denominada papers.

Como posso fazer isso?


1
Como você gostaria de lidar com o caso, existem dois arquivos a/x.pdfe b/x.pdf?
Coronel Panic

Respostas:



30
  find /bunchopdfs -name "*.pdf" -exec mv {} /papers \;    

Aqui está um teste que eu fiz

$ ls -R
.:
a  aaa bbb.pdf  pdfs

./a:
foo.pdf

./pdfs:

Observe o arquivo "aaa bbb.pdf".

$ find . -name "*pdf" -exec mv {} pdfs \;
$ ls -R
.:
a  pdfs

./a:

./pdfs:
aaa bbb.pdf  foo.pdf

Lindo! +1!
PenguinCoder

Você não precisa citar "{}"para lidar com nomes de arquivos que contêm espaços?
terdon 21/09/12

@terdon: Na verdade, não, você não (embora esse tipo de problema me pegue às vezes). Veja a resposta atualizada.
RedGrittyBrick

4
find -print0 /directory/with/pdfs -iname "*.pdf" | xargs -0 mv -t /papers

(semelhante a outra resposta, mas eu prefiro pipe / xargs / mv ... mais intuitivo para mim)

Para sua informação, eu fiz o script de uma linha acima com êxito em vários diretórios e vários arquivos pdf.


1
xargs tem o problema de "espaços nos nomes de arquivos" que -exec não. Você pode mediar isso adicionando args -print0à sua localização e -0ao xargs.
Rich Homolka

@RichHomolka ver resposta alterada. (. Obrigado pela dica Isso é realmente útil!)
Trevor Boyd Smith

Você já tentou isso? Parece que você precisa adicionar o "-print0" no final do comando find
tollo

0

Para a linha de comando do Windows (cmd.exe), você pode usar:

for /F "usebackq delims==" %j IN (`dir /s /b *.pdf`) do copy "%j" c:\target_dir

1
Olá e bem-vindo ao SU. Obrigado pela sua resposta, mas a pergunta solicita especificamente uma solução Linux.
terdon 21/09/12

2
Ainda é maravilhoso que as janelas também possam fazer isso!
Vorac 26/09/12

0

Se você estiver pesquisando apenas um diretório em profundidade, poderá:

mkdir <destination>
mv */*.pdf <destination>

onde <destination>significa algum diretório. mvnão criará automaticamente um diretório para você.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.