我想将目录中的所有文件名列为使用 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
因为它太慢(特别是在cygwin上) 。
使用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
答案 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
find . -type f
:从当前目录下获取所有文件tr '\n' '\0'
:将find的输出转换为以空分隔的列表。xargs -0 YOUR_PROGRAM
使用空定界符而不是默认的空格定界符将该列表传递给您的程序,以便处理带有空格的文件名。答案 4 :(得分:-3)
我终于找到了一个很好的解决方案:
find . | awk '{printf "%s ", $0}'