У меня есть следующий скрипт:

#!/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 ответ1

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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .