如何使用 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