今天发现自己写的CMS有一个小bug。现在我想用相同的文件名重写服务器上的所有文件。但是,我确实有一些客户自定义了特定文件,因此我无法覆盖所有文件。
由于有些客户有自定义文件,我需要检查文件大小。
当文件大小与其源不同时,它应该覆盖。当文件大小相同时,它应该跳过该文件。
几个月前,我问了一个有点类似的问题,如何从一个源覆盖多个文件。我也设法解决了这个问题:
echo /home/*/*/phpthumb | xargs -t -n 1 cp -r /home/test/testuser/phpthumb/*
我可以在带有小 if / else 的 .sh 脚本中使用它来重写或跳过文件吗?如果是,我怎样才能做到这一点?
我的 unix 经验很一般,所以如果我的问题有不清楚的地方,请随时提问。
亲切的问候。
答案1
我假设您更改了一台服务器上的源文件之一中的源代码,并且希望将修复程序移植到其他网站上,对吗?如果您保留了原始文件的副本(当我不记得该项目时我总是这样做),请使用您最好的资产diff
::
diff -Nau old/file new/file > file.patch
您将看到原始源文件和更正后的源文件之间的差异,您可以通过 SSH 使用这些文件修补所有服务器,例如:
# See what's to be done, no action
cat file.patch | ssh server "patch -d <directory> --dry-run"
# Apply the patch if all seems good
cat file.patch | ssh server "patch -d <directory>"
如果未更改的副本与已更正的文件位于不同的目录中,则可能需要调整补丁头。但基本上,如果两者都在同一目录中,file.php
即固定文件和file.php.orig
原始文件,cd
则到您网站的根目录并运行命令diff
,例如:
cd /home/www/htdocs/www.mysite.tld
diff -Nau some/deep/dir/file.orig.php some/deep/dir/file.php > /tmp/file.patch
来自其他网站的根目录:
# See what's to be done, no action
patch -d /home/www/htdocs/www.my.other.site.tld --dry-run < /tmp/file.patch
# Apply the patch if all seems good
patch -d /home/www/htdocs/www.my.other.site.tld < /tmp/file.patch
其他有用的论点是-p
。diff
和都patch
可以在目录树上工作以递归地应用修复。您还可以通过将它们连接到一个文件中来构建更复杂的补丁。有关如何使用它们的更多详细信息,请参阅patch --help
和。diff --help
答案2
根据您最初的问题逐字记录,这就是您想要的,但请参阅下面的我的评论。您可能只想find
先单独尝试该部分,以确保您拥有正确的文件。
find /home -maxdepth 3 -mindepth 3 -path */phpthumb/filename ! -size xxxx |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
为了使其按照我的评论工作并替换相同大小的,只需删除!
.
更新
实际上比较 MD5 和是更好的方法。它更加强大,因为您的自定义文件之一可能恰好具有相同的大小。你可以尝试:
original_md5=$(md5sum /path/to/original | awk '{print $1}')
echo /home/*/*/phpthumb/filename |
xargs md5sum |
grep "^$original_md5" |
awk '{print $2}' |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
这是替换所有与原始文件匹配的文件。要按照您的问题逐字执行此操作,请将-v
选项添加到grep
.另请注意,如果任何搜索路径中有空格(以防万一自上一个问题以来已添加它们),这些答案都不起作用。