Find

當某些路徑有空格時,從遞歸文件列表創建 md5 雜湊

  • November 6, 2011

我需要為一個主目錄中的每個目錄和文件創建一個 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

如何解釋帶有空格的目錄?

xargs很少有用,因為它期望以非常特殊的方式引用輸入,這是沒有通用工具產生的。正如您所注意到的那樣mycommand $(find …),它並不好,因為它首先連接所有文件名,然後在空格處拆分。

使用-execprimary offind使其在md5沒有需要引用的干預shell 的情況下執行。如果您的實現find是相當最新的,那麼您可以讓它做xargs著名的事情,即md5每批參數呼叫一次程序。

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

如果您find不支持-exec … {} +,請替換+by \;。這會依次find呼叫每個文件。md5它的速度稍慢,但隨處可用。

引用自:https://unix.stackexchange.com/questions/23988