linux diff 工具:创建修改文件列表

linux diff 工具:创建修改文件列表

如何使用 Linux 命令行工具以编程方式创建已修改文件的列表?我对任何特定文件(增量、补丁)的差异不感兴趣。我只想获得与以前的产品版本相比的新文件或修改文件的列表。这样我就可以发布新产品更新。

更新:diff -qr不会产生非常方便的输出。的输出diff -qr也需要进行处理。还有更好的办法吗?

答案1

您可以使用差异工具:请参阅选项 -q 和 -r

-q  --brief
Output only whether files differ.

-r  --recursive
Recursively compare any subdirectories found.

例子:

diff -qr dir1 dir2

答案2

我有一个简单的方法:使用 rsync-preview 模式:

rsync -aHSvn --delete old_dir/ new-dir/

该命令显示为“要删除”的文件将是“新”文件。其他要转移的内容也发生了某种变化。有关更多详细信息,请参阅 rsync-man-page。

答案3

diffutils软件包包含一个lsdiff工具。只需将 的输出传递diff -u给 lsdiff:

diff -u --other-diff-options path1 path2 | lsdiff

答案4

要以编程方式创建新文件或修改文件的列表,我能想到的最佳解决方案是使用同步,种类, 和独特的:

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

让我用这个例子来解释一下:我们想要比较两个 dokuwiki 版本,看看哪些文件被更改了,哪些文件是新创建的。

我们使用 wget 获取 tars 并将它们解压到目录old/new/

wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29d.tgz
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29.tgz
mkdir old && tar xzf dokuwiki-2014-09-29.tgz -C old --strip-components=1
mkdir new && tar xzf dokuwiki-2014-09-29d.tgz -C new --strip-components=1

以一种方式运行 rsync 可能会丢失新创建的文件,如 rsync 和 diff 的比较所示:

rsync -rcn --out-format="%n" old/ new/

产生以下输出:

VERSION
doku.php
conf/mime.conf
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

仅在一个方向上运行 rsync 会错过新创建的文件,反之亦然会错过已删除的文件,比较 diff 的输出:

diff -qr old/ new/

产生以下输出:

Files old/VERSION and new/VERSION differ
Files old/conf/mime.conf and new/conf/mime.conf differ
Only in new/data/pages: playground
Files old/doku.php and new/doku.php differ
Files old/inc/auth.php and new/inc/auth.php differ
Files old/inc/lang/no/lang.php and new/inc/lang/no/lang.php differ
Files old/lib/plugins/acl/remote.php and new/lib/plugins/acl/remote.php differ
Files old/lib/plugins/authplain/auth.php and new/lib/plugins/authplain/auth.php differ
Files old/lib/plugins/usermanager/admin.php and new/lib/plugins/usermanager/admin.php differ

两种方式运行 rsync 并对输出进行排序以删除重复项表明最初丢失了目录data/pages/playground/和文件:data/pages/playground/playground.txt

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

产生以下输出:

VERSION
conf/mime.conf
data/pages/playground/
data/pages/playground/playground.txt
doku.php
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

rsync使用这些参数运行:

  • -r“递归到目录”,
  • -c还可以比较相同大小的文件,并且仅“根据校验和跳过,而不是修改时间和大小”,
  • -n“在不进行任何更改的情况下进行试运行”,以及
  • --out-format="%n"到“使用指定的格式输出更新”,这里的“%n”仅用于文件名

两个方向的输出(文件列表)rsync使用 进行组合和排序sort,然后通过使用 删除所有重复项来压缩此排序列表uniq

相关内容