好的,我想做的是,我有一个文件,我必须替换该位置中的大约 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 循环也适合你的二进制替换。
答案2
这样是行不通的。你可以将一个源复制到一个目标,或将多个源复制到一个目录,但不能将一个源文件复制到多个目标文件。
对于复制问题,可以利用find
和grep
的帮助xargs
:
find /home -type f | grep \/home\/[[:alnum:]]+\/service[[:alnum:]]*\/ | xargs -l1 cp sourcefile
但首先检查所有正确的文件是否匹配,例如通过删除最后一个带有 的管道xargs
。
答案3
我能够使用“cp -f”选项让第二部分工作,该选项确实会覆盖正在运行的文件。但我仍然不确定递归问题。