【问题标题】:Odd cp behavior in bash scriptbash脚本中的奇怪cp行为
【发布时间】:2018-04-06 20:52:23
【问题描述】:

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

我正在尝试做的基本 sn-p:

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

关于此的额外特殊之处在于,如果我重新运行脚本而不更改任何内容,我会得到以下输出:

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

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

任何见解都将不胜感激。

【问题讨论】:

  • 我们正在等待您的文件匹配测试。
  • 太棒了。谢谢你。不幸的是,实际的脚本需要一些时间来运行,所以它可能有点。我正在测试。上面有什么完全错误的吗?
  • 您应该使用findfind $source_loc/dir/ -type f -exec cp {} $target_loc/dir/ \;

标签: bash unix aix


【解决方案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/

【讨论】:

  • 很明显我的代码中有一个错误。我将@codeforester 的答案标记为正确,因为他们为我指明了方向。所以在我尝试这个副本之前,有一个函数可以执行。在这个函数中,我设置了 shop -s nullglob。我尝试在函数结束时取消设置它,但我有一个错字。诀窍是这个函数只有在它之前没有被执行的情况下才会被执行(因此为什么后续的运行会返回预期的错误)。我更新了我的代码来做 shop -u nullglob 并且我得到了预期的没有这样的文件或目录消息。请注意,匹配时没有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
相关资源
最近更新 更多