CP 命令创建递归目录

CP 命令创建递归目录

好的,我想做的是,我有一个文件,我必须替换该位置中的大约 100 个文件:/home/*/service*/files/递归使用该文件。

我使用了以下命令:

cp -r File.txt /home/*/service*/files
cp: overwrite `/home/xxx/servicexxx/files/CustomCommands.txt'? y
cp: overwrite `/home/xxx/servicexxx/files/files/tips.txt'? ^C

为什么它会在文件夹内创建一个“文件”文件夹,而不是直接替换已经存在的文件。如果我不使用“-r”开关,它会正确复制,但会忽略显示“cp 省略目录

其次,我必须使用相同的方法来替换正在运行的二进制文件,以便下次运行该文件时它会自动切换到新文件。但我收到此错误:

cp: cannot create regular file `xxx': Text file busy

答案1

您在这里感到困惑的是 cp 如何解释参数,以及 shell 扩展如何工作。首先,让我们谈谈 shell 扩展。假设您有一个简化的目录/文件结构,如下所示:

/home/user1/service1/files/file1.txt
/home/user7/service100/files/file2.txt
/home/user22/service7/files/file3.txt

现在考虑你的命令:

cp -r File.txt /home/*/service*/files

shell 将根据其可以匹配的文件扩展第二个参数执行 cp。您可以通过替换cp来查看它是否正常工作echo。您运行的实际命令是:

cp -r File.txt /home/user1/service1/files /home/user7/service100/files /home/user22/service7/files

该命令的工作方式cp是将一个或多个源复制到单身的目标,因此您要做的是将前三个参数复制到最后一个参数中:/home/user22/service7/files

再次查看这一点,它准确地解释了为什么你的文件被正确地复制到最后一个目录,而你却发现了一些cp: ommiting directory错误。

为了实现您想要做的事情,您可以使用循环for

for target in /home/*/service*/files/; do
    cp -v File.txt $target
done

Text File Busy下面的链接稍微介绍了一下这个错误,这可能是由于你错误使用 造成的cp。我怀疑像上面这样的 for 循环也适合你的二进制替换。

https://stackoverflow.com/questions/10638283/can-text-file-busy-happen-when-two-processes-trying-to-execute-a-perl-file-in

答案2

这样是行不通的。你可以将一个源复制到一个目标,或将多个源复制到一个目录,但不能将一个源文件复制到多个目标文件。

对于复制问题,可以利用findgrep的帮助xargs

find /home -type f | grep \/home\/[[:alnum:]]+\/service[[:alnum:]]*\/ | xargs -l1 cp sourcefile 

但首先检查所有正确的文件是否匹配,例如通过删除最后一个带有 的管道xargs

答案3

我能够使用“cp -f”选项让第二部分工作,该选项确实会覆盖正在运行的文件。但我仍然不确定递归问题。

相关内容