如何将`find`的输出作为空格分隔的字符串?

时间:2014-09-18 08:45:33

标签: bash find

我想将目录中的所有文件名列为使用 Space 字符作为分隔符的单个参数字符串行。

让我们考虑一下这个目录:

/project
├─ foo bar.c
├─ bar is not baz.c
├─ you"are"doomed
└─ baz.c

我的问题的输出是:

. "./bar is not baz.c" ./baz.c "./foo bar.c" 'you"are"doomed'

或者

. foo\ bar.c bar\ is\ not\ baz.c baz.c you\"are\"doomed

显然它不能与空字符\0一起使用,因为这个字符不能在参数行上处理:

find . -print0

. foo bar.c\0bar is not baz.c\0baz.c\0you"are"doomed

我的目标是以这种方式将这些文件传递给另一个程序

program `find . | magic` 

. foo\ bar.c bar\ is\ not\ baz.c baz.c you\"are\"doomed

编辑(3年后)

devsolar确定我的问题是一种XY问题。他的解决方案允许将文件列表传递给程序。但它并没有完全回答最初的问题。

我需要参数 string 的原因是我想避免为找到的每个文件执行program因为它太慢(特别是在上) 。

使用xargs也无济于事,因为它无法逃脱所有字符。最接近解决方案的是这个oneliner:

find . -print0 | perl -e 'local $/="\0";print join(" ",map{s/(?=["'"'"' ])/\\/gr}<STDIN>);'

. ./bar\ is\ not\ baz.c ./baz.c ./foo\ bar.c ./haha\"haha

5 个答案:

答案 0 :(得分:10)

待办事项

find . -exec program {} +

以文件名列表作为参数调用program。如果找到 lot 文件,则可能会多次调用program以避免过长的命令行。

待办事项

find . -exec program {} \;

找到的每个文件调用program

是的,这个 可以正确使用文件名中的空格。

答案 1 :(得分:4)

如果你可以使用其他命令,可能

find . | paste -sd " "

做你需要的。

答案 2 :(得分:1)

要将由换行符分隔的列表转换为由换行符分隔的列表,您要做的就是像这样对它们进行回显:

echo $(find)

答案 3 :(得分:0)

这可能对您有用:

$ find -type f .| tr "\n" "\0" | xargs -0 YOUR_PROGRAM
  1. find . -type f:从当前目录下获取所有文件
  2. tr '\n' '\0':将find的输出转换为以空分隔的列表。
  3. xargs -0 YOUR_PROGRAM使用空定界符而不是默认的空格定界符将该列表传递给您的程序,以便处理带有空格的文件名。

答案 4 :(得分:-3)

我终于找到了一个很好的解决方案:

find . | awk '{printf "%s ", $0}'