cp: fts_open: нет такого файла или каталога / почему?
У меня есть следующий скрипт:
#!/bin/bash
echo "This script will copy all JPG files inside directory '~/temp/merged':";
pwd;
read -r -p "Please confirm, that you want to copy all JPG files [y/N]" response
case $response in
[yY][eE][sS]|[yY])
find . -iname "*.jpg" -type f -print0 | while IFS= read -d '' f ;
mkdir -p ~/temp/merged;
do
echo "$f"
cp "$f" ~/temp/merged/$orig_f
done
;;
*)
;;
esac
Это дает мне ошибки в конце правильного выполнения:
cp: fts_open: нет такого файла или каталога
Зачем? Пожалуйста, помогите понять.
1 ответ
Я не могу точно сказать, в чем ваша проблема, но есть несколько вопросов.
Основная проблема, которую я вижу, с этой строкой:cp "$f" ~/temp/merged/$orig_f
Перед выполнением cp оболочка ищет переменную orig_f
(это не существует).
Подчеркивания являются действительными символами в именах переменных, т.е. variable_a="value"
, Поэтому, если вы пытаетесь добавить префикс или добавить переменную с подчеркиванием, вам нужно сделать так: ${variable}_a
,
Другая проблема связана с цитированием. Сказать orig_f
существует, содержимое может содержать пробелы, которые расширяются и вызывают проблемы. Поэтому не забудьте процитировать любые переменные, которые могут расширяться как таковые.
Вы можете значительно упростить ваш скрипт, используя:
mkdir -p ~/temp/merged
find . -iname "*.jpg" -type f -print -exec cp {} ~/temp/merged \;
Если вы должны использовать цикл while, сделайте это вместо этого:
mkdir -p ~/temp/merged
while IFS= read -d '' f; do
echo "$f"
cp "$f" ~/temp/merged
done < <(find . -iname "*.jpg" -type f -print0)