如何使用查找文件中列出的路径,同时确保处理好空格?

如何使用查找文件中列出的路径,同时确保处理好空格?

我有一个名为 的文件中的路径列表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

相关内容