使用 cp 从包含空目录的目录复制文件也会导致错误返回值,这会导致我的脚本失败。
有没有办法让它跳过目录而没有错误返回值?我希望错误值能够反映任何错误,但是其中有一个空目录应该被跳过,而不会被报告为错误。
我可以只添加递归标志-r,但如果我只是不想复制目录,但我确实希望报告任何错误怎么办?
小智 5
cp确实没有只获取文件的选项,但正如berserck所说,您可以find与cp. 事实上,这非常简单:
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
Run Code Online (Sandbox Code Playgroud)
或者:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
Run Code Online (Sandbox Code Playgroud)
find是查找您想要的文件的工具。在第一个选项中,我们设置-type f为仅返回常规文件。在第二个选项中,我们设置-not -type d来获取除目录之外的所有内容。一次find执行传递给-execdir替换一个结果条目的参数,并在找到 时停止命令(应该转义or ,否则 shell 可能会展开它)。{};;\;";"
-execdir将运行将文件的文件夹作为其“工作目录”的命令,并且最好而不是-exec,请检查下面。
选项-type文档:
-C型
文件类型为 c:
b:块(缓冲)特殊
c:字符(无缓冲)特殊
d:目录
p:命名管道(先进先出)
f:常规文件
l:符号链接;如果 -L 选项或 -follow 选项有效,则这永远不会成立,除非符号链接已损坏。如果要在 -L 生效时搜索符号链接,请使用 -xtype。
s: 插座
D:门(Solaris)
选项-not文档:
!表达式
如果 expr 为假,则为真。该字符通常还需要保护以免受 shell 的解释。
-不是表达式
与...一样 !expr,但不符合 POSIX 标准。
选项-execdir文档:
-执行命令;
执行命令;如果返回 0 状态则为 true。find 的所有以下参数都被视为命令的参数,直到出现由 ';' 组成的参数 遇到。字符串“{}”将被替换为正在处理的当前文件名(在命令 [...] 的参数中出现的所有位置)。这两种结构可能都需要转义(使用“\”)或引用,以防止它们被 shell 扩展。对于每个匹配的文件,指定的命令运行一次。该命令在起始目录中执行。使用 -exec 操作存在不可避免的安全问题;您应该使用 -execdir 选项。
-execdir命令;
与 -exec 类似,但指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是您开始查找的目录。这是一种更安全的调用命令的方法,因为它避免了解析匹配文件的路径期间的竞争条件。[...] 如果使用此选项,则必须确保 $PATH 环境变量不引用“.”;否则,攻击者可以通过在要运行 -execdir 的目录中保留适当命名的文件来运行他们喜欢的任何命令。这同样适用于 $PATH 中的条目为空或不是绝对目录名称。
https://linux.die.net/man/1/find
我建议您使用 rsync 而不是 cp,如果可以的话,它有选项 -m 来排除空文件夹,例如:
rsync -am <origin> <destination>
Run Code Online (Sandbox Code Playgroud)
explainshell.com中命令的解释
我使用 -a 选项,因为它执行了很多很好的默认操作,但如果您愿意,也可以使用 -r 选项,这将仅设置递归模式。
[添加评论]
我不知道如何使用 cp 执行此操作,至少手册页没有显示任何可以为您执行此操作的选项。您可能可以通过使用命令find查找要复制的文件/目录列表,然后将其传递给 cp 来实现更复杂的解决方案,但这比 rsync 复杂得多。rsync 在许多 Linux 中甚至几乎是标准配置
| 归档时间: |
|
| 查看次数: |
15990 次 |
| 最近记录: |