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ć?


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

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.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.