用bash中的另一个文件替换整个文件

Posted

技术标签:

【中文标题】用bash中的另一个文件替换整个文件【英文标题】:replace a whole file with another file in bash 【发布时间】:2012-08-25 07:08:32 【问题描述】:

我已经学习了如何使用 bash 脚本替换一行,但我想学习如何用另一个文件夹中同名的另一个文件替换整个文件。这可能吗??

【问题讨论】:

【参考方案1】:
cp -f [oringinal file] [new file]

复制原始文件并覆盖目标文件(因此-f代表“强制”)。

【讨论】:

我无法处理这个。我错过了什么还是需要以 done 结束它??? 你写的命令是什么?你不需要方括号。 附带说明,当使用 sudo 完成时,这会保留原始文件的模式和所有权 如果您仍然看到提示,请在命令行中使用which cp 来检查cp 别名。 看起来你切换了参数,应该是相反的。 cp -f [new file] [original file]【参考方案2】:

如果您试图仅复制文件的内容,请尝试

cat /first/file/same_name > /second/file/same_name

这将用第一个文件的内容覆盖第二个文件的所有内容。但是,您的第二个文件的所有者、组和权限将保持不变。

【讨论】:

“覆盖内容”和“复制”如果目标文件是符号链接则有点不同:-)【参考方案3】:

使用这些命令:

mv file1 file2

如果 file2 不存在,则将 file1 重命名为 file2。如果 file2 存在,则将其内容替换为 file1 的内容。

mv -i file1 file2

然而,与上面一样,由于指定了"-i"(交互式)选项,如果 file2 存在,则在用 file1 的内容覆盖之前提示用户。

mv file1 file2 file3 dir1

文件file1、file2、file3 被移动到目录dir1。 dir1 必须存在,否则mv 将退出并出现错误。

mv dir1 dir2

如果 dir2 不存在,则将 dir1 重命名为 dir2。如果 dir2 存在,则在目录 dir2 中创建目录 dir1。

【讨论】:

这并不完全符合 OP 的要求 - 它移动/重命名文件,而不是复制/覆盖它们... 嗨@Christian 感谢您的评论。您能否进一步详细说明?我想了解为什么重命名文件与替换不同。例如,如果我想用 file2 “替换” file1,为什么我不能这样做: mv file2 file1 ?如果先删除 file1,此命令是否会替换? 重命名文件意味着它不会存在于原始位置 - 在我看来,OP 想要的是覆盖一个没有任何副作用的文件。【参考方案4】:

今天我需要相同的解决方案,唯一的改变是我需要用新版本替换许多用户目录中的旧版本 php 文件。我要去这里,只是将匹配与其他堆栈的答案混合并解决我的问题。我使用 @joseph 代码和 find 命令。

我在这里分享我的小代码,希望对某人有所帮助。

for file in $(find /home/*/ -type f -name 'timthumb.php');
do
    cat /home/timthumb.php > $file;
done

【讨论】:

要确保它不仅仅适用于文本文件,请使用 cp -f,例如find -type f -iname myFile | while read fileName; do cp-f ../sourceFileLocation/myFile $fileName; done 它还将从 ../sourceFileLocation/myFile 获取文件并替换当前目录和子目录中的所有匹配项,但保证可以使用二进制文件。我个人也更喜欢| while read 而不是for $()

以上是关于用bash中的另一个文件替换整个文件的主要内容,如果未能解决你的问题,请参考以下文章

用文件中的另一个词替换特定词[关闭]

如何在 bash 脚本中用多行/流替换单个流/行?

用 Bash 脚本中的 sed 替换文件中的版本号

用R中的另一个值替换数据框多列中出现的数字

如何在bash中替换文件中的单词

如何使用 bash 脚本替换文件名中的空格