使用空格作为批量参数的文件名

ami*_*dfv 2 bash shell file

如果我有一个文件列表,其中一些文件的名称中有空格,请说:

find . -iname "*hs" | grep foo
Run Code Online (Sandbox Code Playgroud)

如何将它们作为参数传递给单个进程process name1 name2 ...

请注意,我想将所有文件名作为单个参数传递给单个进程,因此标准for f in *解决方案不起作用

Jon*_*ler 5

find . -iname "*hs*" -exec grep foo {} +

find . -iname "*hs*" -print0 | xargs -0 grep foo
Run Code Online (Sandbox Code Playgroud)

两者都有效; 第一个甚至可能更有效率,除非该+选项将更少的文件分组到命令行xargs中.

如果您通过shell globbing生成文件名,那么:

grep foo *hs*
Run Code Online (Sandbox Code Playgroud)

保留文件名中的间距.使用ls生成的名字是非常有问题的.


过滤名称

grep命令用于在批量处理之前过滤文件名列表,而不是搜索文件本身的内容.

所以你想要与' hs '和' foo ' 相匹配的名字?在这种情况下,你最好find还是使用静止:

find . \( -iname "*hs*" -a -iname "*foo*" \) -exec grep foo {} +
Run Code Online (Sandbox Code Playgroud)

使用的布尔功能find.

GNU grep扩展-Z-z

如果你不能做到这一点(你的grep正则表达式需要为太复杂find),那么你的困难是,除非你有一个(假设的?)版本grep,将 "线"用null分隔.

-Z,--null
输出零字节(ASCII NUL字符),而不是通常在文件名后面的字符.例如,grep -lZ在每个文件名后输出一个零字节而不是通常的换行符.即使存在包含不常用字符(如换行符)的文件名,此选项也会使输出明确无误.此选项可以与像命令一起使用 find -print0, perl -0,sort -z,和xargs -0处理任意的文件名,即使是那些包含换行符.

这几乎是想要的,但并不完全.POSIX 2008 getdelim()功能将是使用的工具; 为此目的添加一个-z选项grep,然后使用它grep -lzZ ....来过滤find ... -print0数据xargs -0.

上面的引用来自Mac OS X 10.7.5上的手册页,GNU grep是2.5.1版.也许更新版本的GNU grep可以提供更好的帮助?

而且,看,GNU grep2.14支持必要的选项:

-z,--null-data
将输入视为一组行,每个行以零字节(ASCII NUL字符)而不是换行符结束.与-Zor --null选项一样,此选项可与'sort -z'之类的命令一起使用来处理任意文件名.

从中运行脚本 find

另一个不容忽视的选择是创建一个由find命令运行的脚本:

find . -iname "*hs*" -exec ./list-foo + 
Run Code Online (Sandbox Code Playgroud)

list-foo脚本可能是:

for arg in "$@"
do
    case "$arg" in
    (*foo*) echo "$arg";;   # This will still cause problems
    esac
done
Run Code Online (Sandbox Code Playgroud)

这标识文件; 这echo是次优的.也许您需要捕获数组中的名称,然后使用该数组调用最终命令:

array=( )
i=0
for arg in "$@"
do
    case "$arg" in
    (*foo*) array[$((i++))]="$arg";;
    esac
done

if [ "$i" -gt 0 ]
then real_work "${array[@]}"
fi
Run Code Online (Sandbox Code Playgroud)

real_work执行实际工作的程序(脚本?)在哪里?list-foo一旦你完成它就可以扔掉,除非你一遍又一遍地做同样的过滤工作.


包含空格的全局名称

您可以通过转义空间来包含空格的glob名称:

rm -i -- *\ *
Run Code Online (Sandbox Code Playgroud)

这将扩展为名称中包含空格的文件名,这有助于使用包含为测试此问题的答案而创建的文件的文件名来清理目录.