我有以下 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)