我希望运行一个Linux命令,它将递归地比较两个目录,并只输出不同目录的文件名。这包括在一个目录中而不在另一个目录中的任何内容,反之亦然,以及文本差异。


当前回答

rsync -rvc --delete --size-only --dry-run source dir target dir

其他回答

如果你想获取一个文件列表,这些文件只在一个目录中,而不是它们的子目录,只有它们的文件名:

diff -q /dir1 /dir2 | grep /dir1 | grep -E "^Only in*" | sed -n 's/[^:]*: //p'

如果你想递归列出所有的文件和目录,它们的完整路径是不同的:

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}'

这样就可以对所有文件应用不同的命令。

例如,我可以删除dir1而不是dir2中的所有文件和目录:

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}' xargs -I {} rm -r {}

从diff手册页:

-q只报告文件是否不同,而不报告差异的细节。 -r在比较目录时,递归地比较找到的任何子目录。

示例命令:

diff -qr dir1 dir2

示例输出(取决于地区):

$ ls dir1 dir2
dir1:
same-file  different  only-1

dir2:
same-file  different  only-2
$ diff -qr dir1 dir2
Files dir1/different and dir2/different differ
Only in dir1: only-1
Only in dir2: only-2

在我的linux系统上获取文件名

diff -q /dir1 /dir2|cut -f2 -d' '
rsync -rvc --delete --size-only --dry-run source dir target dir

您也可以使用rsync

rsync -rv --size-only --dry-run /my/source/ /my/dest/ > diff.out