У меня есть большая папка с подпапками с файлами pdf. Я хочу получить все файлы pdf (290 из них) и поместить их в один каталог. (Я думал, что это будет просто.), Чтобы я мог объединить их в один документ с моей программой pdf pdfshuffle или чем-то в этом роде. Я получил путь и имена файлов в файл: out.txt
, используя: find $ (pwd) -iname '* .PDF'> out.txt
out.txt содержит пути и файлы вроде этого:
...
/home/user/Downloads/pedals/PEDALS/Electro-Harmonix/Small Stone Phaser.PDF
/home/user/Downloads/pedals/PEDALS/Electro-Harmonix/Dr. Quack (Doctor Q Melhorado).pdf
/home/user/Downloads/pedals/PEDALS/Marshall/Guv'Nor 1.PDF
/home/user/Downloads/pedals/PEDALS/Marshall/Guv'Nor 2.pdf
...
круто. Итак, я подумал, что могу сделать это:
#!/bin/bash
input="out.txt"
while IFS= read -r line
do
#echo "$line"
cp $line .
done < "$input"
Но он копирует только около 36 PDF-файлов, а оболочка говорит, что не может статовать файлы:
...
cp: cannot stat 'Boogie/Vtwin.pdf': No such file or directory
cp: cannot stat '/home/user/Downloads/pedals/PEDALS/Mesa': No such file or directory
...
Файл явно там, и я могу его просмотреть и т. д. в чем проблема с моим методом или сценарием?
Обработка имен файлов, содержащих пробелы или другие забавные символы, легко выполняется с помощью find
и xargs
. Прочитайте man find xargs
и выполните что-то вроде
find . -mindepth 1 -type f -iname '*.pdf' -print0 | \
xargs -0 -r echo mv -t $PWD
для проверки команд, и когда они соответствуют ожиданиям...
удалите «echo
», чтобы фактически выполнять команды.