У меня есть, file
который содержит список имен. то есть:
Long Name One (001)
Long Name Two (201)
Long Name Three (123)
...
с пробелами и некоторыми специальными символами. Я хотел сделать каталоги из этих имен, а именно:
cat file | xargs -l1 mkdir
Это делает отдельные каталоги , разделенные пробелами, т.е. Long
, Name
, One
, Two
, Three
, а Long Name One (001)
, Long Name Two (201)
, Long Name Three (123)
.
Как я могу это сделать?
shell
xargs
whitespace
Majal
источник
источник
-d
варианта.Если ваш вариант поддержки реализации xargs
-0
:POSIXly:
(Обратите внимание, что использование
while
цикла для обработки текста считается плохой практикой в сценарии оболочки)источник
mkdir
на каталог,mkdir
может принимать более одного аргумента.xargs
ожидает очень особый формат ввода, в котором аргументы разделяются пробелами или символами новой строки (иногда другими формами вертикального пробела, иногда зависящими от текущей локали), и где одинарные кавычки, двойные кавычки и обратный слеш могут использоваться для их экранирования (но в другом путь из кавычек оболочки).-l1
не для передачи одной строки ввода в качестве единственного аргументаmkdir
, а для вызова одногоmkdir
вызова для каждой отдельной строки ввода, но со словами в этой строке, которые по-прежнему выделяются в качестве различных аргументовmkdir
.Реализация GNU
xargs
добавила-0
возможность десятилетия назад принимать входные данные, разделенные NUL. Это наиболее очевидный способ отделить слова, которые в конечном итоге станут аргументами команды, потому что символ NUL оказывается единственным символом, который не может встречаться в аргументе команды или имени файла (выбранный формат списка, в котором по одному файлу в строке не может представлять все возможные имена файлов, так как не допускает новую строку в имени файла).Это
-0
было скопировано несколькими другимиxargs
реализациями, но не всеми.С тем, что вы можете сделать:
Это будет вызывать
mkdir
как можно меньше раз с максимально возможным количеством аргументов.Но обратите внимание, что если
file
он пуст,mkdir
он все равно будет запущен, и вы получите синтаксическую ошибкуmkdir
из-за отсутствующего аргумента. GNUxargs
добавил-r
опцию для того, что было скопировано несколькими другими реализациями.GNU
xargs
также добавил (позже)-d
возможность указывать произвольные разделители, но я не думаю, что какая-либо другая реализация скопировала его. С GNUxargs
лучший способ:Передавая файл с
-a
(также расширением GNU) вместо stdin, это означает, чтоmkdir
stdin сохраняется.POSIXly, вам нужно будет постобработать ввод, чтобы поместить его в ожидаемый формат
xargs
. Вы можете сделать это, например, с:Где мы заключаем каждую строку в двойные кавычки и экранируем каждую,
"
как"\""
перед передачей в xargs.Но остерегайтесь возможных ограничений:
sed
), если содержимоеfile
не является допустимым текстом в текущей локали. Еслиfile
имена файлов кодируются более чем в одной другой кодировке, или кодировка, отличная от локали, вы можете исправить локаль на C, что должно помочь.xargs
реализации имеют смехотворно низкие ограничения на максимальную длину аргумента (может быть до 255 байт).Чтобы обойти синтаксическую ошибку при пустой ошибке ввода , вы можете написать:
источник
Сделайте так, чтобы имена заканчивались нулем и разделялись там:
tr
заменит символ новой строки, которыйcat
выводится\0
, а-0
флаги вxargs
сообщают ему разделить аргументы на\0
.источник
Вы можете сделать это ПОЛОЖИТЕЛЬНО с помощью
-I
опции:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
источник