在手动指定输入时,如何对xargs使用-0选项?

时间:2011-05-25 19:16:20

标签: bash xargs

我有

~/bashpractice$ ls
dir3 dir1   

我得到了

~/bashpractice$ xargs ls -l 
dir1 dir3
dir1:
total 0
-rw-r--r-- 1 abc abc 0 2011-05-23 10:19 file1
-rw-r--r-- 1 abc abc 0 2011-05-23 10:19 file2

dir3:
total 0
-rw-r--r-- 1 abc abc 0 2011-05-23 10:20 file1
-rw-r--r-- 1 abc abc 0 2011-05-23 10:20 file2

但是当我这样做时出现错误

~/bashpractice$ xargs -0 ls -l
dir1 dir3
ls: cannot access dir1 dir3
: No such file or directory

abc@us-sjc1-922l:~/bashpractice$ xargs -0 ls -l
dir1
dir3 
ls: cannot access dir1
dir3
: No such file or directory

如何在为xargs指定-0选项时获取列表?

2 个答案:

答案 0 :(得分:10)

例如 - 正如man xargs

中所述
  

-0将xargs更改为期望NUL(``\ 0'')   字符作为分隔符,而不是   空格和换行符。这是预料之中的   与-print0一起使用   函数在find(1)。

找到。 -print0 | xargs -0 echo

-0 告诉xargs一件事。 “不要用空格分隔输入,而是使用NULL char”。当您需要处理名称中包含space的文件和/或目录时,通常与find结合使用非常有用。

还有更多可以与-print0一起玩的命令 - 例如grep -z。

编辑 - 基于评论:

见Seth的答案或:

ls -1 | perl -pe 's/\n/\0/;' > null_padded_file.bin
xargs -0 < null_padded_file.bin

但这是一个奇怪的,为什么要使用-0如果你不需要使用它?。比如“为什么要删除文件,如果不存在?”。简单地说,如果输入为空填充,则-0只需要与组合一起使用。期。 :)

答案 1 :(得分:2)

xargs的工作方式与您的想法不同。它接受输入并运行作为参数提供的命令以及从输入读取的数据。例如:

find dir* -type f -print0 | xargs -0 ls -l

ls -d dir* | xargs '-d\n' ls -l

look foo | xargs echo

look foo | perl -pe 's/\n/\0/;' | xargs -0 echo

如果您怀疑输入中可能包含空格或返回值,则经常使用-0,因此默认参数分隔符“\ s”(正则表达式\ s,空格,制表符,换行符)不好。< / p>