Как я могу использовать опцию -0 для xargs при указании ввода вручную? - PullRequest
5 голосов
/ 25 мая 2011

У меня есть

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

Как получить список при указании -0 вариант к xargs?

Ответы [ 2 ]

10 голосов
/ 25 мая 2011

Например - как сказано в man xargs

-0 Изменить xargs на ожидаемый NUL (`` \ 0 '') символы в качестве разделителей, а не пробелы и переводы строк. Это ожидается использоваться совместно с -print0 функция в find (1).

найти. -принт0 | xargs -0 echo

-0 говорит Xargs одну вещь. Msgstr "Не разделяйте ввод пробелами, но используйте NULL char". Обычно он полезен в сочетании с find, когда вам нужно обработать файлы и / или каталоги, содержащие в своем имени space.

Есть еще команды, которые могут играть с -print0, например, grep -z.

Редактировать - на основе комментариев:

См. Ответ Сета или это:

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

Но это странно, зачем использовать -0, если вам не нужно его использовать? . Например, «Почему хотите удалить файл, если он не существует?». Проще говоря, -0 нужно использовать только с комбинацией, если ввод заполнен нулями. Период. :)

2 голосов
/ 25 мая 2011

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, пробел, табуляция, символ новой строки) не годится.

...