bash 脚本中的奇怪 cp 行为

Odd cp behavior in bash script

我有一个 bash 脚本正在复制一些文件,但它似乎无法正常工作。附注是源目录中没有匹配的文件。但是脚本的要点是复制文件如果有文件要复制。

我正在尝试做的事情的基本片段:

source_loc=/u01
target_log=/u02
/usr/bin/cp "$source_loc"/dir/*file* "$target_loc"/dir/

结果

Usage: cp [-fhipHILPU][-d|-e] [-r|-R] [-E{force|ignore|warn}] [--] src target
or: cp [-fhipHILPU] [-d|-e] [-r|-R] [-E{force|ignore|warn}] [--] src1 ... srcN directory

如果我将 set -x 添加到我的脚本中,我会得到这个...

+ /usr/bin/cp /u02/dir/
Usage: cp [-fhipHILPU][-d|-e] [-r|-R] [-E{force|ignore|warn}] [--] src target
or: cp [-fhipHILPU] [-d|-e] [-r|-R] [-E{force|ignore|warn}] [--] src1 ... srcN directory
 + set +x

关于此的 EXTRA 奇特之处在于,如果我 re-运行 脚本而不更改任何内容,我将得到以下输出:

cp: /u01/dir/*file*: No such file or directory

现在我还没有用源代码中的匹配文件测试这个脚本(我很快就会),但我想确保我没有遗漏任何东西。我不在乎出现错误,我只想确保我得到正确的错误(即没有这样的文件或目录)。

如有任何见解,我们将不胜感激。

您可以按照@elliotfrisch 的建议使用find

find "$source_dir/dir" -type f -name "*file*" -maxdepth 1 -exec cp {} "$target_loc/dir" \;

或者,在 Bash 中,您可以将 glob 结果捕获到一个数组中,并在数组不为空时调用 cp

shop -s nullglob # glob expands to nothing if there are no matching files
files=("$source_loc/dir/"*file*)
((${#files[@]} > 0)) && cp "${files[@]}" "$target_loc"/dir/