当某些路径有空格时,从递归文件列表创建 md5 哈希值

当某些路径有空格时,从递归文件列表创建 md5 哈希值

我需要为一个主目录中的每个目录和文件创建一个 md5 哈希值。唯一阻止我成功的是找到一种解决路径中带有空格的文件的方法。

我正在使用 find 进行递归列表(我读过 find 是执行此操作的最佳方法):

c5-26-1# find /root/newdir
/root/newdir
/root/newdir/1
/root/newdir/2
/root/newdir/3
/root/newdir/4
/root/newdir/5
/root/newdir/newdir2
/root/newdir/newdir2/1
/root/newdir/newdir2/2
/root/newdir/new
/root/newdir/dir
/root/newdir/new dir

当我使用 md5 尝试此操作时,我得到两个不同的结果,但都不起作用:

c5-26-1# md5 $(find /root/newdir) # same outcome using for loop
MD5 (/root/newdir) = bc79a580f6c932937f6fcd454747db72
MD5 (/root/newdir/1) = 94ca98295946310ce88e185ea57486d5
MD5 (/root/newdir/2) = 8432051f64459be5a5e73dc2abd91795
MD5 (/root/newdir/3) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/4) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/5) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2) = 722165901468b9596dbdddfe118759fb
MD5 (/root/newdir/newdir2/1) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2/2) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (/root/newdir/dir) = 148538718feba14839f5d1072854c5f4
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (dir) = 148538718feba14839f5d1072854c5f4

或者

c5-26-1# find -X /root/newdir | xargs md5
find: /root/newdir/new dir: illegal path
MD5 (/root/newdir) = bc79a580f6c932937f6fcd454747db72
MD5 (/root/newdir/1) = 94ca98295946310ce88e185ea57486d5
MD5 (/root/newdir/2) = 8432051f64459be5a5e73dc2abd91795
MD5 (/root/newdir/3) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/4) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/5) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2) = 722165901468b9596dbdddfe118759fb
MD5 (/root/newdir/newdir2/1) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2/2) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (/root/newdir/dir) = 148538718feba14839f5d1072854c5f4

如何解释带有空格的目录?

答案1

xargs很少有用,因为它期望以一种非常特殊的方式引用输入,而通用工具不会产生这种方式。正如您所注意到的那样mycommand $(find …),这并不好,因为它首先连接所有文件名,然后在空格处拆分。

使用-exec主要的 offind使其md5在没有需要引用的中间 shell 的情况下执行。如果您的实现find相当最新,那么您可以让它执行xargs众所周知的操作,即md5每批参数调用该程序一次。

find /root/newdir -type f -exec md5 {} +

如果您find不支持-exec … {} +,请将+其替换为\;.这使得依次调用每个文件findmd5它稍微慢一些,但随处可用。

答案2

为什么不直接使用md5深正是执行此操作的工具吗?大多数 Linux 发行版都包含它,通常位于名为md5deep.

答案3

如果您使用-exec开关,find我认为它会自动为您转义。

相关内容