我想找到文件中字节的差异。但是,带有 -a 的 du/diff 命令还列出目录和子目录。我只想要子目录和目录中的文件,而不是这些文件。
我知道 --exclude 选项,但我不知道如何操纵它来做到这一点。谢谢。
我的操作系统是linux debian。
我的命令是
dira=/mnt/hdd_a/;
dirb=/mnt/hdd_b/;
diff -u <(cd $dira && du -ab | sort -k2) <(cd $dirb && du -ab | sort -k2)
我也无法完全理解输出。我认为目录有 + 或 - 的差异有多种原因,例如。属性。我不在乎这个。但是,在数百个文件中,diff 打印一些不带 + 或 - 的文件。为什么?除了尺寸之外,它们可能在其他一些属性上有所不同?
--- /dev/fd/63 2023-08-22 01:38:15.775099368 +0300
+++ /dev/fd/62 2023-08-22 01:38:15.775099368 +0300
@@ -1,6 +1,6 @@
-364123856483 .
+364123860579 .
435823780 ./vid_01.mkv
-33781164566 ./news_a
+33781168662 ./news_b
19110023 ./news_c/covers_09.rar
161634304 ./news_d/video_d7.avi
17080320 ./news_e/video_d17.avi
据我了解,“u”选项仅打印 3 行。我想要所有差异线,而且只想要这些。不同的行(文件大小)。
使用 diff --changed-group-format='%<' --unchanged-group-format='' <(cd "$dira" && du -ab | sort -k2) <(cd "$dirb" && du -ab | sort -k2)
打印一些文件及其大小,没有任何“+/-”指示。所以我不知道差异是来自源文件还是来自目标文件。请注意,目标中丢失了整个文件。
如果我理解正确的话,您只想查看目录树中所有文件的大小,而不是任何目录本身内容的总大小。不幸的是,
--exclude
选项du
似乎不支持使用诸如/
指示目录之类的东西,例如du --exclude='*/'
仍会输出目录的大小。du
您可以使用类似仅获取文件列表之类的命令(find
例如使用其-type f
选项),然后将此列表传递给du
. 该find
命令在其自己的行上输出每个文件名,我们可以du
借助xargs
. 该xargs
命令期望各个参数由任何空格字符(例如空格、制表符、换行符)分隔,但如果任何文件名包含空格,则不会xargs
执行我们期望的操作,因此我们告诉find
用 NULL 字符分隔文件名-print0
,并告诉我们xargs
期待这样的输入-0
:为此,您需要直接比较要比较大小的两个文件的文件大小。该
diff
命令不执行此操作。相反,diff
用于比较两个文件的内容a.txt
,例如,如果文件包含以下内容......并且文件
b.txt
包含以下内容...然后
diff a.txt b.txt
输出:这告诉您两个文件之间的区别是:在 的第 3 行
a.txt
,该行c
被删除 (<
),而该行d
被添加 (>
)。diff
与该选项一起使用-u
会导致它以“统一上下文”补丁文件的样式格式化输出,如命令所使用的那样patch
,并且其样式与其他工具(例如 Git)使用的补丁文件类似。也就是说,diff -u a.txt b.txt
给你这个:这应该可以帮助您理解为什么您会看到
+
以及-
在您运行的命令的输出中。具体来说,cd $dira && du -ab | sort -k2
输出 的内容的大小$dira
,按项目名称排序,因此diff -u <(...) <(...)
采用两个这样的输出并向您显示这些输出之间的差异。以 开头的行-
表示文件存在于$dira
但不在 中$dirb
,反之亦然+
。该命令不会执行任何更智能的操作,例如直接显示和
diff
中特定文件对之间的文件大小差异。为此,您需要以某种方式指定要比较哪些文件对的大小。$dira
$dirb
例如,如果您想比较
$dira/news_a
和的大小$dirb/news_b
,那么您应该直接这样做。如果您只想比较名称完全相同$dir_a
的文件对的大小,例如和,则可以通过编程方式完成,如以下 Bash 脚本所示:$dir_b
$dir_a/news_a
$dir_b/news_a
环境变量定义在循环
$IFS
等结构中用作项目分隔符的字符。for
在这里,我们将其设置为换行符 ,$'\n'
其原因与我们xargs
之前使用 NULL 分隔符的原因类似。我们使用
stat
代替来du
获取文件大小,因为它更快一些,并且我们将不存在的文件的大小视为零,以便报告其大小并计算大小差异;该命令[ -f filename ]
用于检查文件是否filename
存在。Bash 语法
$((...))
用于执行计算,例如$((2+3))
输出5
;这里我们只是从一个文件大小中减去另一个文件大小。