Jak mogę rekurencyjnie skopiować wszystkie pliki pdf z katalogu (i jego podkatalogów) do jednego katalogu wyjściowego?

20

Mam katalog zawierający dużą liczbę plików PDF, z których niektóre znajdują się w podkatalogach (które mogą mieć głębokość kilku warstw). Chciałbym przenieść wszystkie pasujące pliki *.pdfdo jednego folderu wyjściowego o nazwie papers.

W jaki sposób mogę to zrobić?

blz
źródło
1
Jak chcesz obsłużyć sprawę, są dwa pliki a/x.pdfi b/x.pdf?
Pułkownik Panic

Odpowiedzi:

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

Oto test, który zrobiłem

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

./a:
foo.pdf

./pdfs:

Zwróć uwagę na plik „aaa bbb.pdf”.

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

./a:

./pdfs:
aaa bbb.pdf  foo.pdf
RedGrittyBrick
źródło
Piękny! +1!
PenguinCoder,
Nie musisz cytować, "{}"aby zajmować się nazwami plików zawierającymi spacje?
terdon
@terdon: Właściwie nie, nie masz (choć tego rodzaju problem czasami mnie łapie). Zobacz zaktualizowaną odpowiedź.
RedGrittyBrick
4
find -print0 /directory/with/pdfs -iname "*.pdf" | xargs -0 mv -t /papers

(podobny do innej odpowiedzi, ale wolę pipe / xargs / mv ... bardziej intuicyjny dla mnie)

Do twojej wiadomości, zrobiłem powyższy skrypt jednowierszowy z powodzeniem w wielu katalogach i wielu plikach pdf.

Trevor Boyd Smith
źródło
1
xargs ma problem z „spacjami w nazwach plików”, których nie ma -exec. Możesz nieco temu zaradzić, dodając argumenty -print0do swojego znaleziska i -0do xargs.
Rich Homolka,
@RichHomolka zobacz zmienioną odpowiedź. (Dzięki za podpowiedź. To naprawdę przydatne!)
Trevor Boyd Smith
Czy kiedykolwiek tego próbowałeś? Wygląda na to, że musisz dodać „-print0” na końcu polecenia find
tollo
0

W wierszu polecenia systemu Windows (cmd.exe) można użyć:

for /F "usebackq delims==" %j IN (`dir /s /b *.pdf`) do copy "%j" c:\target_dir
JackyBill
źródło
1
Witam i witam w SU. Dziękuję za odpowiedź, ale pytanie konkretnie dotyczy rozwiązania dla systemu Linux.
terdon
2
Nadal jest cudowne, że Windows to potrafi!
Vorac,
0

Jeśli przeszukujesz tylko jeden katalog głęboko, możesz:

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

gdzie <destination>oznacza jakiś katalog. mvnie utworzy automatycznie katalogu dla Ciebie.

Kevin Dong
źródło