我正在使用这个 bash 脚本来检查两个路径的内容install
并install1
作为参数传递是否相同:
#!/bin/sh
du -a $1 | grep -Po "[0-9]+\t$1/\K.*" | sort -n > list.txt
du -a $2 | grep -Po "[0-9]+\t$2/\K.*" | sort -n > list1.txt
cmp list.txt list1.txt
我以这种方式运行脚本:
./compare-folders install install1
并且文件列表之间的比较失败:
list.txt list1.txt differ: byte 3557704, line 37504
哪个应该意味着一个文件夹中至少有一个文件在另一个文件夹中丢失。
list.txt
我使用 diff 检查了和之间的差异list1.txt
,发现两个文件都缺少一些行。第一行在 中缺失,list.txt
但在 中存在list1.txt
(即第一个文件显然不存在于install
但存在于install1
)是:
Windows/WinSxS/amd64_microsoft-windows-g..cy-script.resources_31bf3856ad364e35_6.3.9600.16384_it-it_b734f6cc26342351/gpscript.dll.mui
但该文件实际上存在于两个文件夹中。我费心检查的另外两个文件也存在同样的情况。
奇怪的是,删除的行的选择显然是随机的,而多次运行脚本总是产生完全相同的结果。
我经常会忽略一些愚蠢的事情。我试图弄清楚那是什么,但目前还没有成功。
答案1
du -a $1 | grep -Po "[0-9]+\t$1/\K.*" | sort -n > list.txt
您使用 grep 命令删除文件大小,然后按数字对结果进行排序。这听起来不对。
那尝试一下
du -a "$1" | sort -n | grep -Po "[0-9]+\t\Q$1\E/\K.*" > list.txt
我在变量周围添加了\Q
and ,以便将其视为文字字符串,即使它包含正则表达式特殊字符\E