gpt4 book ai didi

linux - 没有覆盖 -n 被 cp 命令忽略

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:40 26 4
gpt4 key购买 nike

我正在尝试 cp OSX 桌面上的一些适合五位数模式的文件。它有效,但我不明白为什么 -n 选项被忽略。如果文件已经在目的地,我不想覆盖它。

find ./prefix* -name '[0-9][0-9][0-9][0-9][0-9]' -maxdepth 5 -exec cp -nr {} ./dest \; 

一切都被复制,即使一个目录已经在dest中。我怎样才能强制不覆盖? This solution在 super 用户上表示我可以简单地将 dest 中所有内容的权限更改为只读。但是我觉得我的实现 cpman 页面上的不一致肯定是有原因的,因此应该有更好的方法来解决问题。

此外,被覆盖文件的权限是 rwxr-xr-x(如果您喜欢八进制,则为 0755)。

最佳答案

cp不会做你想做的事。您需要遍历 find 的输出。假设您找到的任何路径中都没有空格或其他特殊字符(如果有,请参见下文):

find ./prefix* -name '[0-9][0-9][0-9][0-9][0-9]' -maxdepth 5 | \
while read dir
do
target=./dest/$(basename $dir)
[ -d $target ] || cp -r $dir ./dest/
done

这是有效的,因为只要 read 返回成功,while 就会继续执行 dodone 之间的操作。 find 的输出通过管道传输到 read 中,因此每次 read dir 执行时,它都会从 find 中读取一行输出并将其分配给 dir变量。

find中没有更多的行要读取时,read返回失败并且循环终止。

在循环体内,basename 打印传递给它的路径的最后一部分。在这种情况下,5 位数字。

[ ... ] 是用于运行条件测试的 shell 术语。 (是的,[ 是一个命令!)您可以说 test -d ... 而不是 [ -d ... ]。参见例如https://unix.stackexchange.com/questions/99185/what-do-square-brackets-mean-without-the-if-on-the-left有关这方面的更多信息)

-d ... 如果参数作为目录存在则返回成功。否则失败。

|| 表示或 - 所以 foo || bar 仅在 foo 失败时执行 bar

所以循环体基本上说:

let target be "dest/" + the basename of $dir
such a directory exists or copy $dir into dest/

我希望这能澄清一点。它是用很少的代码编写的大量 shell 行话。所有这些基本上都是 bash 联机帮助页中的信息,尽管可以说是一种更难访问的格式。

如果 find 找到的任何路径有可能包含空格或其他特殊字符,那么您需要添加引号和其他一些花哨的东西:

find ./prefix* -name '[0-9][0-9][0-9][0-9][0-9]' -maxdepth 5 -print0 | \
while IFS= read -r -d '' dir
do
target="./dest/$(basename "$dir")"
[ -d "$target" ] || cp -r "$dir" ./dest/
done

关于linux - 没有覆盖 -n 被 cp 命令忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com