Find

如何使用 find 與文件中列出的路徑同時確保空間得到照顧?

  • November 20, 2021

我有一個名為pathlist.txt. 它看起來像這樣:

/home/abc/dirA
/home/abc/dirB
/home/abc/dir with space
/home/abc/dirX

我需要在每個路徑中找到所有文件。以下方法有效,但僅適用於其中沒有空格的路徑:

find $(tr '\n' ' ' < pathlist.txt) -type f -printf "%p, %AY-%Am-%Ad \n"

我嘗試了設置IFS=$'\n'和一些實驗,xargs但沒有成功。關於如何確保 find 接受其中包含空格(可能還有其他特殊字元)的路徑的任何建議?

假設bash,一種方法是:

readarray -t a < pathlist.txt
find "${a[@]}" -type f ....

如果您使用的是 xargs 的 GNU 實現,則可以使用該-d選項來設置分隔符,在本例中為換行符。

展示:

xargs -d '\n' -I{} printf '<<%s>>\n' '{}' <<END
abc def
unix and linux
END
<<abc def>>
<<unix and linux>>

因此,您的命令的第一次嘗試將是

xargs -a pathlist.txt -d '\n' -I{} -- \
  find '{}' -type f -printf "%p, %AY-%Am-%Ad \n"

這有兩個問題:

  • 正如替換所暗示的那樣,它現在將執行幾個find實例。xargs -I``-L1
  • 對於包含換行符的文件名,您仍然會遇到問題。

printf %q您可以通過使用 GNU生成為 shell 轉義的字元串來解決第一個問題:

find $(xargs -a pathlist.txt -d '\n' printf '%q\n') \
   -type f -printf "%p, %AY-%Am-%Ad \n"

對於第二個,請考慮使用 with分隔\0,並使用xargs -0to 將其用作分隔符。

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