почему этот сценарий bash не работает получить все файлы?

У меня есть большая папка с подпапками с файлами 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
...

Файл явно там, и я могу его просмотреть и т. д. в чем проблема с моим методом или сценарием?

1
задан 3 January 2021 в 01:14

1 ответ

Обработка имен файлов, содержащих пробелы или другие забавные символы, легко выполняется с помощью find и xargs. Прочитайте man find xargs и выполните что-то вроде

find . -mindepth 1 -type f -iname '*.pdf' -print0 | \
    xargs -0 -r echo mv -t $PWD

для проверки команд, и когда они соответствуют ожиданиям...
удалите «echo», чтобы фактически выполнять команды.

1
ответ дан 2 January 2021 в 23:26

Другие вопросы по тегам:

Похожие вопросы: