Find
如何使用 find 與文件中列出的路徑同時確保空間得到照顧?
我有一個名為
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 -0
to 將其用作分隔符。