На этот вопрос уже есть ответ здесь:
Пользователи Linux! У меня проблема:
У меня есть все файлы PDF в каталоге Загрузки
, но я хочу, чтобы он скопировал все файлы в подпапке \ Download \ BOOKS \
. Как мне скопировать все файлы с для цикла
?
для файлов в ...
Я не думаю, что Вы требуете for
цикл только для копирования файлов. Можно скопировать использование файлов:
cp /home/username/Downloads/*.pdf /home/username/Downloads/BOOKS
Но если Вы все еще хотите использовать for
цикл, можно также записать ниже кода:
cd /home/username/Downloads
for F in *.pdf
do
cp "$F" /home/username/Downloads/BOOKS
done
не с для цикла, но это должно работать для перемещения файлов.
mv /home/username/Downloads/*.pdf /home/username/Downloads/BOOKS
Используйте это для создания копии файлов:
cp /home/username/Downloads/*.pdf /home/username/Downloads/BOOKS
Существующие ответы все достойны, но имеют переменные незначительные проблемы, которые могут или не могут быть проблематичными. Давайте попытаемся обработать их.
*.pdf
корректный для всех файлов? Я нахожу, что PDFs, загруженные с Интернета часто, *.PDF
вместо этого. (Я подозреваю, что определенные нечувствительные к регистру файловые системы вызывают это.)BOOKS/Romance
, BOOKS/Horror
например.Стратегия состоит в том, чтобы использовать find
определять местоположение потенциального PDFs, file
отфильтровать только фактический PDFs и затем действовать на те имена файлов.
find -L books -maxdepth 1 -print0 | xargs -0 -n1 -I{} sh -c '[ "$(file -b --mime-type "{}")" = "application/pdf" ] && cp "{}" Download/'
find -L Download/BOOKS -maxdepth 1 -print0
определит местоположение всех записей файловой системы в дереве подкаталога, запускающемся в Download/BOOKS
, переходить по символьным ссылкам в случае необходимости, на максимальную глубину. Увеличьте число глубины, чтобы обработать подкаталоги или удалить -maxdepth 1
обработать целое дерево.
xargs -0 -n1 -I{}
проводит несколько строк входа и неоднократно выполняет команду с 1 входной строкой.
sh -c '[ "$(file -b --mime-type "{}")" = "application/pdf" ] && cp "{}" Download/'
делает новую оболочку для запущения теста на записи файловой системы, и если это - PDF (как определено расширением файла, и содержание файла) делают копию из него к Download/
каталог.
Используя find
заботится о 1., 2. и 4. Используя file
заботится о 3. Используя -print0
и -0
аргументы и тщательное заключение в кавычки заботятся о 5.
Если Вам действительно был нужен цикл, потому что Вы хотите выполнить другие команды на каждом PDF, замене cp "{}" Download/
с чем approriate. {}
шаблон, который xargs заменит каждым именем файла, когда это работает.
Я не знаю о для циклов (если Вы не пишете программу C для достижения этого), но эта строка должна сделать это:
cp -v ~/Downloads/*.pdf ~/Downloads/BOOKS/
CP является копией, и *, чтобы подстановочный знак выбрал что-либо заканчивающееся в .pdf в том каталоге.
Простое для цикла должно смочь сделать то, в чем Вы нуждаетесь, т.е. копируете все файлы PDF при Загрузках (включая подкаталоги) в к Загрузкам/КНИГАМ
cd Downloads
IFS=$(echo -en "\n\b") && for n in `find . -path ./BOOKS -prune -o -name "*.pdf" -print`; do cp -fv "$n" ./BOOKS; done
Обратите внимание, что одинарная кавычка для оператора находки является обратной одинарной кавычкой, не нормальной.
Отредактированный: Внутренний разделитель полей необходим для пробелов в именах файлов.
Простое для цикла будет работать, но намного более сложно, чем это должно быть.
for FILE in ~/Downloads/BOOKS/*.pdf; do
cp "$FILE" /new/directory/
done
Это скопирует все файлы в каталоге BOOKS к/new/directory