Cygwin 如何将'find'的输出作为空格分隔的字符串获取?

Cygwin 如何将'find'的输出作为空格分隔的字符串获取?,cygwin,bash,find,Cygwin,Bash,Find,我想将目录中的所有文件名列为一个单参数字符串行,使用空格字符作为分隔符 让我们考虑这个目录: /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' 或 显然,它不适用于空字符\0,因为无法在参数行上处理此字符: find . -print0 . foo bar.

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

让我们考虑这个目录:

/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'

显然,它不适用于空字符
\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年后)

正如我的问题所指出的,这是一种XY问题。他的解决方案允许将文件列表传递给程序。然而,它并没有完全回答最初的问题

我需要参数字符串的原因是,我希望避免为找到的每个文件执行
程序
,因为它太慢(尤其是在上)

使用
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
find-print0 | perl-e'local$/=“\0”;打印连接(“,映射{s/(?=[“]”)/\\/gr});'
../bar\is\not\baz.c./baz.c./foo\bar.c./haha\“哈哈

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

find . | paste -sd " "
你需要什么就做什么

在OS X上,需要另一个参数:

find . | paste -sd " " -

用于以文件名列表作为参数调用
程序
。如果找到大量文件,则可能需要多次调用
程序
,以避免命令行过长

为找到的每个文件调用
程序


是的,这确实适用于文件名中的空格。

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

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

这可能对您有用:

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

  • 要将一个由换行符分隔的列表转换为一个由换行符分隔的列表,只需对其执行如下回显:

    echo $(find)
    

    如果文件名包含空格怎么办?很好!我想我应该用引号来逃避它!您是否也需要子目录中的所有文件,或者一个glob
    程序*
    就足够了?与其转义,不如使用
    -print0
    。请记住:``(一个空格)和/或
    \n
    (一个换行符)是有效的文件名。。。如果您想在管道中处理包含
    \n
    的文件名,转义并没有真正的帮助……为此,用空格替换换行符既不必要,也没有效果。在它周围加上引号就像你在表演一样是行不通的。DevSolar演示了如何将find输出作为参数正确地传递给命令。为什么这比您所拥有的更方便?因为
    paste-sd
    不适用于
    cleartool find
    并且
    cleartool find-exec
    太慢。所以这个解决方案对我来说是有效的。最好的解决方案+1.这不适用于带有空格的文件名。虽然这段代码可能会解决这个问题,但如何以及为什么解决这个问题会真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
    find . | awk '{printf "%s ", $0}'
    
    $ find -type f .| tr "\n" "\0" | xargs -0 YOUR_PROGRAM
    
    echo $(find)