xargs -0 производит новую линию - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующие файлы:

#ls
test  test2  test3  test4

теперь в соответствии с xargs -0 ввод обрезается на основе нуля вместо пробела, следовательно, поскольку в моем входе нет нуля, 4 файла должны быть напечатаныв одной команде эха.В результате получается одна команда эха. Однако между каждым файлом есть новая строка:

#ls | xargs -0
test
test2
test3
test4

Чтобы быть уверенным, что есть только одна команда:

 ls | xargs -0 -p
echo test
test2
test3
test4
 ?...n

почему между каждой строкой стоит новая строкафайл?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Вы не подаете команду на xargs, что необычно.Команда по умолчанию xargs использует , если ничего не указано, /bin/echo.xargs читает вывод из ls и разбивает его на слова;каждое слово становится параметром для выполнения команды xargs.Опция -0 делает нулевой символ разделителем слов, используемым для разделения.Поскольку null не появляется в выходных данных ls, весь выходной результат считается одним словом и передается в /bin/echo в качестве единственного параметра, в результате чего в командной строке

/bin/echo 'test
test2
test3
test4'

выводится изls содержит символы новой строки, с другой стороны, это свойство ls, когда вывод не является терминалом, как правильно объяснил Джон.

0 голосов
/ 12 декабря 2018

При копировании файлов используйте find вместо ls!

$ find /my/path -print0 | xargs -0 -p

С -print0 вы также можете обрабатывать файлы, где в имени файла используется пробел (0x20).

0 голосов
/ 12 декабря 2018

Когда ls печатает в TTY, он форматирует имена файлов в столбцах, но когда он записывает в файл, канал или другой не TTY, он ведет себя как ls -1 и печатает одно имя файла в строке.Вы можете проверить это, запустив ls | cat вместо ls.

С ls | xargs -0, новые строки приходят с ls, а не с xargs.xargs действительно читает одну строку так, как вы ожидаете, но в этой строке есть символы новой строки.

См. Также:

...