find 測試和 bash 測試沒有給出相同的結果,為什麼?

find 測試和 bash 測試沒有給出相同的結果,為什麼?

在我之前的問題中在find -exec中,如何用{}取代目前檔案?,我已經詢問過測試find。我想找到所有不屬於我的文件。所以有正確的 find 指令:

find . -type f ! -user "$USER"

但這也應該是這樣:

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

但兩者給出了不同的結果。

1) 如果我這樣做[command one] | wc -c--> 4121

但是:[command two] | wc -c--> 236768 (PS:我正在 $HOME 中搜尋文件)。

兩者都給出了不同的發現文件數量。

2)兩者仍然給出結果文件,即目錄(是的,我不擁有目錄,因此 - 權限被拒絕)。儘管find . -type f選項參數中有類型檔案(而不是目錄),但他們還是給了目錄,為什麼? (當我ls -ld其中一個目錄時,沒有一個是連結或其他任何內容)

答案1

嗯...,在我的主目錄中,這兩個指令的工作方式相同。 8-/

儘管如此,您應該將 stderr 重定向到 /dev/null 並使用wc -l它來正確計算輸出。

find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

從這裡您可以將結果重定向到文字檔案並比較檔案以查找差異。

find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

如果存在差異,請取出 /tmp/file_2.txt 的一些多餘文件,並進一步調查為什麼該文件不被視為“如果文件存在且由有效用戶 ID 擁有,則為 True”。

答案2

為了避免find輸入您實際上無法存取的目錄,您可以使用! -executable -prune

find . ! -executable -prune -type f ! -user "$USER"

-executable對於您無權存取的目錄,否定測試將成立,並將-prune從 的搜尋樹中刪除這些目錄find,阻止實用程式嘗試存取它們,從而避免產生權限錯誤。

-executable測試(以及類似的-readable-writable測試)是非標準的,需要 GNU find

我(還)無法對結果的差異發表任何評論,因為您對此隻字未提。由於輸出的大小差異如此之大,因此尋找和檢查一個命令找到了另一個命令未找到的內容的情況應該是微不足道的。

相關內容