我有
~/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选项时获取列表?
答案 0 :(得分:10)
例如 - 正如man xargs
找到。 -print0 | xargs -0 echo-0将xargs更改为期望NUL(``\ 0'') 字符作为分隔符,而不是 空格和换行符。这是预料之中的 与-print0一起使用 函数在find(1)。
-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>