cp:fts_open:没有此文件或目录/为什么?

cp:fts_open:没有此文件或目录/为什么?

我有以下 bash 脚本:

#!/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 之前,shell 正在寻找一个变量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)

相关内容