Как я могу рекурсивно скопировать все PDF-файлы в каталоге (и его подкаталогах) в один выходной каталог?


20

У меня есть каталог, содержащий большое количество файлов PDF, некоторые из которых находятся в подкаталогах (которые могут расширяться на несколько уровней). Я хотел бы переместить все файлы, соответствующие *.pdfодной выходной папке с именем papers.

Как я могу это сделать?


1
Как бы вы хотели , чтобы обработать случай , есть два файла a/x.pdfи b/x.pdf?
полковник Паник

Ответы:



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

Вот тест, который я сделал

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

./a:
foo.pdf

./pdfs:

Обратите внимание на файл "aaa bbb.pdf".

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

./a:

./pdfs:
aaa bbb.pdf  foo.pdf

Прекрасный! +1!
PenguinCoder

Вам не нужно заключать в кавычки, "{}"чтобы иметь дело с именами файлов, содержащими пробелы?
Тердон

@terdon: На самом деле, нет, вы не делаете (хотя такого рода проблемы меня иногда ловят). Смотрите обновленный ответ.
RedGrittyBrick

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

(похоже на другой ответ, но я предпочитаю pipe / xargs / mv ... более интуитивно для меня)

К вашему сведению, я успешно выполнил приведенный выше однострочный скрипт для нескольких каталогов и нескольких файлов PDF.


1
У xargs есть проблема «пробелов в именах файлов», которых нет у -exec. Вы можете несколько опосредовать это, добавив аргументы -print0к своей находке и -0к xargs.
Rich Homolka

@RichHomolka см измененный ответ. (Спасибо за совет. Это действительно полезно!)
Тревор Бойд Смит

Вы когда-нибудь пробовали это? Похоже, вам нужно добавить "-print0" в конце команды find
tollo

0

Для командной строки Windows (cmd.exe) вы можете использовать:

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

1
Привет и добро пожаловать в СУ. Спасибо за ваш ответ, но вопрос специально требует решения Linux.
Тердон

2
Все еще удивительно, что окна могут сделать это также!
Vorac

0

Если вы ищете только один каталог, вы можете сделать:

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

где <destination>обозначает какой-то каталог. mvне будет автоматически создавать каталог для вас.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.