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/
我有一个 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/