Bash脚本 - 在变量中存储没有空格的find命令输出

Veb*_*ebz 5 bash

我希望自动化我的xcode项目.除了带有空格的项目名称外,一切正常.我尝试了以下命令:

output_apps=`find ./ -name "*.app" -print`
output_apps=`find ./ -name "*.app"`
Run Code Online (Sandbox Code Playgroud)

我跑的时候

find ./ -name "*.app" -print 
Run Code Online (Sandbox Code Playgroud)

没有存储到变量,它给我输出如下所述的预期:

.//Ten EU.app
.//Ten Official App EU.app
.//Ten Official App.app
.//Ten.app
Run Code Online (Sandbox Code Playgroud)

但是,当我将上述命令的输出存储在变量中时,如下所示

output_apps=`find ./ -name "*.app" -print`
Run Code Online (Sandbox Code Playgroud)

然后运行以下for循环以获取名称

for curr_app in $o
do 
    echo "$curr_app"
done
Run Code Online (Sandbox Code Playgroud)

表明

.//Ten
EU.app
.//Ten
Official
App
EU.app
.//Ten
Official
App.app
.//Ten.app
Run Code Online (Sandbox Code Playgroud)

如何维护每个输出之间的空格并获得以下输出?

Ten EU.app
Ten Official App EU.app
Ten Official App.app
Ten.app
Run Code Online (Sandbox Code Playgroud)

Ola*_*che 15

如果您不需要将文件名存储在变量中,则可以find -print0与组合使用xargs -0.这会将找到的条目与NUL字节而不是换行符分开.xargs读取这些NUL分隔值并使用尽可能多的参数调用某些命令.

find ./ -name "*.app" -print0 | xargs -0 some-command
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以限制给参数的个数some-commandxargs -n 1

find ./ -name "*.app" -print0 | xargs -0 -n 1 some-command
Run Code Online (Sandbox Code Playgroud)

另一种方法是用while循环读取文件

find ./ -name "*.app" -print | while read f; do
    some-command "$f"
done
Run Code Online (Sandbox Code Playgroud)

这会一次调用一个文件.最重要的一点是要封闭$f双引号.