#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», могут сгенерировать его, но вы не можете с клавиатуры.