Как я могу использовать параметр -0 для xargs при указании входных данных вручную?

#bash #xargs

#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
  

Как получить список при указании параметра -0 для xargs?

Ответ №1:

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

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

 find . -print0 | xargs -0 echo
  

-0 Сообщает xargs одну вещь: «Не разделяйте ввод пробелами, а используйте нулевой символ». Обычно это полезно в сочетании с find, когда вам нужно обрабатывать файлы и / или каталоги, которые содержат space в своем названии.

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


Редактировать (на основе комментариев)

Смотрите ответ Сета или это:

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

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

Комментарии:

1. Могу ли я не использовать xargs -0, не используя его с find ?

2. Как мне ввести нуль-поле в xargs? Я думаю, что я не знаю, как это сделать. Я попытался включить 0 в качестве завершающего символа в имена каталогов, но это не сработало.

3. @abc: Проверьте мой ответ выше. Я привожу пример, в котором я превращаю ввод, разделенный новой строкой, во ввод, разделенный нулем.

4. Пожалуйста, посмотрите на мой первоначальный вопрос. Я пытаюсь успешно запустить xargs со второй попытки (одна выдает ошибку), описанную выше.

5. @Seth, но вы используете xargs -0 в конвейере. Я хочу пример, в котором xargs -0 не используется в конвейере.

Ответ №2:

xargs работает иначе, чем вы думаете. Он принимает входные данные и выполняет команды, предоставленные в качестве аргументов, с данными, которые он считывает из входных данных. Например:

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

ls -d dir* | xargs '-dn' ls -l

look foo | xargs echo

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

Вы часто используете -0, если подозреваете, что во входных данных могут быть встроенные пробелы или возвраты, поэтому разделитель аргументов по умолчанию » s» (регулярное выражение s, пробел, табуляция, перевод строки) не подходит.

Комментарии:

1. @Игнасио Васкес-Абрамс: использование xargs с tty-вводом почти всегда является признаком неправильного мышления, особенно если вы предоставляете все аргументы в одной строке ввода. Еще больше с xargs -0. Если вы не пытаетесь превратить вырезанные элементы в аргументы команды (например, вставить возвращаемый разделенный список имен файлов в аргументы ls -l), вы не хотите использовать xargs интерактивно. xargs предназначен для использования в конвейере команд.

2. @Seth, я понимаю, что мне не следует использовать xargs так, как я использую (вторая попытка в моем исходном сообщении). Но вы хотите сказать, что я никак не мог бы использовать / запускать xargs (без ошибок) подобным образом?

3. @abc: Аргумент, который вы передаете в ls, — это «dir1 ndir2 n» Имя файла с двумя встроенными символами новой строки в нем. Вполне возможно создать имя файла с двумя встроенными символами новой строки в нем, так что теоретически это действительно могло бы сделать что-то полезное. Но на практике не так много. Вы не можете ввести ASCII NULL в обычном приглашении командной строки, поэтому вы никогда не сможете указать более одного аргумента. Таким образом, «xargs -0» вряд ли является тем дроидом, который вы ищете.

4. @Seth я вижу. ASCII NULL не может быть введен в командной строке. Как насчет ‘ 0’?

5. @abc: — это C-talk для нулевого значения ASCII. Тот же символ. Некоторые программы, такие как «echo», могут сгенерировать его, но вы не можете с клавиатуры.