bash脚本中奇怪的cp行为

时间:2017-10-25 16:49:12

标签: bash unix aix

我有一个复制某些文件的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特有的一点是,如果我重新运行脚本而不改变任何内容,我会将其作为输出:

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

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

任何见解都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

您可以按照@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/