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)
Другие вопросы по тегам