У меня есть файл .txt, который содержит такой текст
A1/B1/C1
A2/B2/C2
A3/B3/C3
Я хочу сценарий, который читает файл .txt для каждой строки, а затем создать каталог на основе первого слова (A1, A2, A3)
Я создал скрипт, как это:
file="test.txt"
while IFS='' read -r line
do
name="line"
mkdir -p $line
done <"$file"
Пока я запускаю его, он создает каталог A1, а затем создает подкаталоги B1 и C1. то же самое происходит для другой линии (A2 * и A3 *)
Что я должен сделать, чтобы создать только каталоги A1, A2, A3?
Я не хочу делать имя как A1 / B1 / C1 с символом '/'. Я просто хочу взять слово перед символом '/' и сделать его именем каталога. Просто «А1», «А2», «А3».
xargs -a<(....)
а не<dirlist.txt cut -d/ -f1 | xargs
?tr
подход - только что понял, чтоparallel
он покрыт по умолчанию.xargs -a<(....)
а не труба - потому что мне нравится это так просто, как это. :)<(...)
также помогает с пробелами, так что это определенно лучший выбор - я не думаю, что кто-либо использовал этот файловый дескриптор в любом случае.cut <dirlist.txt
вместо простоcut dirlist.txt
?Вам нужно установить значение
IFS='/'
for,read
а затем назначить каждое первое поле в отдельную переменную,first
а остальные поля - в переменнуюrest
и просто работать со значением первого поля (или вы можетеread -ar array
использовать один массив и использовать"${array[0]}"
значение первого поля.):Или в одну строку для тех, кто любит это:
Или создайте все каталоги за один раз:
ANSI-C Цитирование
$'...'
используется для борьбы с именами каталогов , содержащих специальные символы.Обратите внимание, что
_
(может быть любым символом или строкой) в конце будет argv [0],bash -c '...'
а$@
завещание содержит остальные параметры, начиная с 1; без этого во второй команде первый параметрmkdir
будет потерян.При
${1%%/*}
использовании расширения подстановки параметров оболочки (POSIX sh / bash / Korn / zsh) удаляется максимально длинное совпадение косой черты, за которым следует что-либо до конца передаваемого в него параметра, представляющего собой строку, читаемую xargs ;Ps:
echo
перед,mkdir
чтобы создать эти каталоги.-d'\n'
на,-0
если ваш список разделен символами NUL вместо\n
ewline (предполагается, что в названии каталога есть / встроенная новая строка).источник
Содержание
test.txt
:Скрипт для создания
A[123]
папок:Выход
ls
:источник
A 12"x4" dir/B b/C c
?Для простого случая, как показано в примере ввода вопроса, просто используйте
cut
и передайте выводmkdir
черезxargs
Для обработки случаев, когда имя каталога может содержать пробелы, мы могли бы добавить
-d '\n'
в список параметров:Для более сложных вариантов, таких как
A 12"x4" dir/B b/C c
предложенные @OleTange в комментариях, можно обратитьсяawk
к созданию разделенного нулями списка вместо разделенного строкой.@dessert в комментариях задавался вопросом,
printf
можно ли использовать вместоcut
, и, технически говоря, это можно использовать, например, ограничивая напечатанную строку шириной только в 3 символа:Не самый чистый способ, но он доказывает, что
printf
может быть использован. Конечно, это становится проблематичным, если имя каталога становится длиннее 3 символов.источник
A 12"x4" dir/B b/C c
?используя Perl:
Или же
если мы хотим принять пробелы в dir-именах
источник
perl -ne 'mkdir for /^([^\/]+)/' list.txt
чтобы закрыть пробелы в именах dir. Мне, наконец, нужно выучить Perl - спасибо!GNU Parallel может быть излишним для этой задачи, но если вы собираетесь делать другие вещи для каждой строки, то это может быть полезно:
Он правильно обрабатывает ввод, как:
источник