查找文件,检查大小并在文件大小不同时覆盖

查找文件,检查大小并在文件大小不同时覆盖

今天发现自己写的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

其他有用的论点是-pdiff和都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.另请注意,如果任何搜索路径中有空格(以防万一自上一个问题以来已添加它们),这些答案都不起作用。

相关内容