![如何使用查找文件中列出的路径,同时确保处理好空格?](https://linux22.com/image/198613/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%97%E5%87%BA%E7%9A%84%E8%B7%AF%E5%BE%84%EF%BC%8C%E5%90%8C%E6%97%B6%E7%A1%AE%E4%BF%9D%E5%A4%84%E7%90%86%E5%A5%BD%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
我有一个名为 的文件中的路径列表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 接受其中包含空格(可能还有其他特殊字符)的路径有什么建议吗?
答案1
假设bash
,一种方法是:
readarray -t a < pathlist.txt
find "${a[@]}" -type f ....
答案2
如果您使用 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
- 对于包含换行符的文件名,您仍然会遇到问题。
您可以通过使用 GNUprintf %q
生成为 shell 转义的字符串来解决第一个问题:
find $(xargs -a pathlist.txt -d '\n' printf '%q\n') \
-type f -printf "%p, %AY-%Am-%Ad \n"
对于第二个,请考虑用 分隔\0
,并使用xargs -0
它作为分隔符。
答案3
该readarray
方法是最简单的,但如果您使用的 shell 不支持它,您可以尝试以下方法,它应该适用于任何 POSIX shell:
while IFS= read -r pathname; do
find "$pathname" -type f
done < pathlist.txt