Создание каталогов с именем из txt-файла, который содержит символ «/»

Для этого действительно нет формулы.

В некоторых местных командах есть место для царапин, где люди могут добавлять проекты. Вот что наш Мичиган выглядит так: https://wiki.ubuntu.com/MichiganTeam/Projects

Вы можете просто добавить раздел на свои страницы LocoTeam в вики, или просто добавить подстраницу к ваше пространство имен, если вы хотите работать над ним, прежде чем перемещать его туда. Например, https://wiki.ubuntu.com/MichiganTeam/Projects , а затем предложите его в список вашей локальной команды.

Вы не слишком конкретны в отношении какой активности вы хотите запустить, но вы можете проверить эти страницы для примеров того, как запускать события, это коллекция из всех видов местных команд о том, как они это делают:

https: //wiki.ubuntu. com / LoCoTeamKnowledgeBase

Если вы не можете найти там информацию, руководители локальной группы находятся в этом списке рассылки, если вы хотите задавать вопросы о том, чтобы что-то делать конкретно, возможно, кто-то уже сделал это и сделал все ошибки и узнали от него. В этом списке много опытных лидеров, поэтому, если вы хотите запустить мероприятие и ищете кого-то, кто проверит его для вас, я буду дальше.

9
задан 25 May 2018 в 17:59

16 ответов

Вы можете просто [ф5] в [ф6]ст Слэш-[ф7]elimited поле каждой строки и дам список [ф8]:

[Ф1]

пример выполнения

[Ф2]

Вы можете столкнуться с проблемами ARG_MAX если ваш список имеет огромное количество имен каталогов, в этом случае использовать GNU на [F9] или [F10] для следующим образом:

[Ф3]

, а на [F11] это, то [ф12] подход не будет работать, если имена каталогов с пробелами – вы можете использовать [от f13] как линия разделитель ИЛИ просто указать [ф14] только разделить ввода на символы новой строки (как это было предложено ARG_MAX вместо):

[Ф4]

в случае любого из поля содержит символ новой строки нужно было бы определить “истинные” символы конца строки и заменить только те символы новой строки, например, с [ф15]. Это будет примером для [ф16], но мне кажется, здесь слишком неправдоподобно.

13
ответ дан 8 June 2018 в 13:59
  • 1
    Почему xargs -a<(....), а не <dirlist.txt cut -d/ -f1 | xargs? – Martin Bonner 24 May 2018 в 19:25
  • 2
    @MartinBonner спасибо за разъяснения, это действительно проще, чем мой подход [Ф1] – просто понял, что [Ф2] покрывает ее по умолчанию. – dessert 24 May 2018 в 23:48
  • 3
    @MartinBonner Почему xargs -a<(....), а не канал - потому что мне это нравится, так просто. :) – dessert 24 May 2018 в 23:51
  • 4
    @AndreaCorbellini О, теперь я понимаю. <(...) также помогает с пробелами, поэтому это, безусловно, лучший выбор - я не думаю, что кто-либо использовал этот файловый дескриптор. – dessert 24 May 2018 в 23:55
  • 5
    @MartinBonner более интересно: почему [Ф1] вместо [Ф2]? – dessert 25 May 2018 в 00:06

Вы можете просто cut удалить 1 st slash- d поле каждой строки и предоставить список mkdir:

mkdir $(<dirlist.txt cut -d/ -f1)

Пример run

$ cat dirlist.txt A1/A2/A3 B1/B2/B3 C1/C2/C3 $ ls dirlist.txt $ mkdir $(<dirlist.txt cut -d/ -f1) $ ls A1 B1 C1 dirlist.txt

Вы можете столкнуться с проблемами ARG_MAX, если в вашем списке содержится огромное количество имен каталогов, в этом случае используйте GNU parallel или xargs следующим образом:

parallel mkdir :::: <(<dirlist.txt cut -d/ -f1) xargs -a<(<dirlist.txt cut -d/ -f1) mkdir

Пока parallel, этот подход xargs не будет работать, если имена каталогов содержат пробелы - вы можете использовать \0 в качестве разделителя строк или просто проинструктировать xargs только разделить вход на символы новой строки (как предложено ARG_MAX ):

xargs -0a<(<dirlist.txt tr \\{n,0} | cut -d/ -f1 -z) mkdir # \\{n,0} equals \\n \\0 xargs -d\\n -a<(<dirlist.txt cut -d/ -f1) mkdir

В случае, если какое-либо из полей содержит символ новой строки, нужно будет идентифицировать окончание строки «true» и заменить только эти символы новой строки, например, [F15]. Это будет случай для awk, но я чувствую, что здесь слишком далеко.

13
ответ дан 17 July 2018 в 13:35

Вы можете просто cut удалить 1 st slash- d поле каждой строки и предоставить список mkdir:

mkdir $(<dirlist.txt cut -d/ -f1)

Пример run

$ cat dirlist.txt A1/A2/A3 B1/B2/B3 C1/C2/C3 $ ls dirlist.txt $ mkdir $(<dirlist.txt cut -d/ -f1) $ ls A1 B1 C1 dirlist.txt

Вы можете столкнуться с проблемами ARG_MAX, если в вашем списке содержится огромное количество имен каталогов, в этом случае используйте GNU parallel или xargs следующим образом:

parallel mkdir :::: <(<dirlist.txt cut -d/ -f1) xargs -a<(<dirlist.txt cut -d/ -f1) mkdir

Пока parallel, этот подход xargs не будет работать, если имена каталогов содержат пробелы - вы можете использовать \0 в качестве разделителя строк или просто проинструктировать xargs только разделить вход на символы новой строки (как предложено ARG_MAX ):

xargs -0a<(<dirlist.txt tr \\{n,0} | cut -d/ -f1 -z) mkdir # \\{n,0} equals \\n \\0 xargs -d\\n -a<(<dirlist.txt cut -d/ -f1) mkdir

В случае, если какое-либо из полей содержит символ новой строки, нужно будет идентифицировать окончание строки «true» и заменить только эти символы новой строки, например, [F15]. Это будет случай для awk, но я чувствую, что здесь слишком далеко.

13
ответ дан 20 July 2018 в 13:40

Вам нужно установить ваш [Ф4] для [ф5], а затем присвоить каждому первому полю в отдельной переменной [ф6] и остальные поля в переменную [ф7] и просто работать на первом поле значение (или вы можете нажать [F8], чтобы один массив и использовать на [F9] для первого поля значение. ):

[Ф1]

или в одну линию для тех, кто любит:

[Ф2]

или создать все каталоги в одном-иди:

[Ф3]

в АНСИ-Си со ссылкой [ф10] используется для борьбы с именами каталог, содержащий специальные символы.

обратите внимание, что на [F11] (может быть любой символ или строку) в конце будет из argv[0] до [F12] и в [от f13] будут содержаться остальные параметры, начиная с 1; без, что во второй команде первый параметр [ф14] будут потеряны.

В [С f15] с помощью АНСИ-Си со ссылкой [ф10], удаляет возможные длинный матч косая черта, после которой ничего до конца передачу параметров в нем, что это линия, которая читает Размер;

п. с:

удалить [ф16] перед [f17 в], чтобы создать эти каталоги. Замените [ф18] с [зг19] если ваш список разделенных символ nul вместо [ф20]ewline (якобы есть в имени каталога и конечно строки не должно быть имя каталога с нулевым либо символов).
10
ответ дан 8 June 2018 в 13:59

Содержание test.txt:

A 12"x4" dir/B b/C c
A1/B1/C1
A2/B2/C2
A3/B3/C3

Сценарий для создания папок A[123]:

file="test.txt"
while read -r line ; do
   mkdir "${line%%/*}"
done < "$file"

Вывод ls:

A 12"x4" dir
A1
A2
A3
6
ответ дан 8 June 2018 в 13:59
  • 1
    Как вы справляетесь с такой ввод [Ф1]? – Ole Tange 25 May 2018 в 14:32
  • 2
    Оле Танге. Этот комментарий кажется совершенно вне сферы действия этого вопроса. – DocSalvager 31 May 2018 в 07:13

Для простого примера, как показано в примере ввода вопроса, просто используйте cut и передайте вывод в mkdir через xargs

cut -f1 -d '/' file.txt | xargs -L1 mkdir 

. Для обработки случаев, когда имя каталога может содержать пробелы, мы могли бы добавить -d '\n' в список опций:

$ cat input.txt 
A 1/B 1/C 1
A 2/B 2/C 2
A 3/B 2/C 2
$ cut -f1 -d '/' input.txt | xargs -d '\n' mkdir 
$ ls
A 1  A 2  A 3  input.txt

Для более сложных вариаций, таких как A 12"x4" dir/B b/C c, как предложено @OleTange в комментариях, можно обратиться к awk, чтобы создать нулевой список вместо списка, разделенного новой строкой.

awk -F'/' '{printf  "%s\0",$1}' input.txt |  xargs -0 mkdir

@dessert в комментариях задается вопросом, можно ли использовать printf вместо cut и технически говорить его можно использовать, например, путем ограничения печатной строки только на ширину в 3 символа:

xargs -d '\n' printf "%.3s\n"  < input.txt | xargs -L1 mkdir 

Не самый чистый способ, но это доказывает, что printf можно использовать. Конечно, это становится проблематичным, если имя каталога становится длиннее 3 символов.

5
ответ дан 8 June 2018 в 13:59
  • 1
    Как вы справляетесь со входом вроде: A 12"x4" dir/B b/C c? – Ole Tange 25 May 2018 в 14:32
  • 2
    @OleTange См. Редактирование. – Sergiy Kolodyazhnyy 25 May 2018 в 17:54

с использованием Perl:

perl -ne 'mkdir for /^(\w+)/' list.txt

Или

perl -ne 'mkdir for /^([^\/]+)/' list.txt

, если мы хотим принимать пробелы в именах dir

2
ответ дан 8 June 2018 в 13:59
  • 1
    perl -ne 'mkdir for /^([^\/]+)/' list.txt, чтобы покрывать пробелы в именах dir. Мне, наконец, нужно изучить Perl - спасибо! – dessert 25 May 2018 в 00:03

Параллель GNU может быть слишком сложной для задачи, но если вы собираетесь делать другие вещи для каждой строки, тогда это может быть полезно:

cat myfile.txt | parallel --colsep / mkdir {1}
parallel -a myfile.txt --colsep / mkdir {1}

Он корректно обрабатывает входные данные:

A 12"x4" dir/B b/C c
0
ответ дан 8 June 2018 в 13:59

Параллель GNU может быть слишком сложной для задачи, но если вы собираетесь делать другие вещи для каждой строки, тогда это может быть полезно:

cat myfile.txt | parallel --colsep / mkdir {1} parallel -a myfile.txt --colsep / mkdir {1}

Он корректно обрабатывает входные данные:

A 12"x4" dir/B b/C c
0
ответ дан 17 July 2018 в 13:35

Для простого примера, как показано в примере ввода вопроса, просто используйте cut и передайте вывод в mkdir через xargs

cut -f1 -d '/' file.txt | xargs -L1 mkdir

. Для обработки случаев, когда имя каталога может содержать пробелы, мы могли бы добавить -d '\n' в список опций:

$ cat input.txt A 1/B 1/C 1 A 2/B 2/C 2 A 3/B 2/C 2 $ cut -f1 -d '/' input.txt | xargs -d '\n' mkdir $ ls A 1 A 2 A 3 input.txt

Для более сложных вариаций, таких как A 12"x4" dir/B b/C c, как предложено @OleTange в комментариях, можно обратиться к awk, чтобы создать нулевой список вместо списка, разделенного новой строкой.

awk -F'/' '{printf "%s\0",$1}' input.txt | xargs -0 mkdir

@dessert в комментариях задается вопросом, можно ли использовать printf вместо cut и технически говорить его можно использовать, например, путем ограничения печатной строки только на ширину в 3 символа:

xargs -d '\n' printf "%.3s\n" < input.txt | xargs -L1 mkdir

Не самый чистый способ, но это доказывает, что printf можно использовать. Конечно, это становится проблематичным, если имя каталога становится длиннее 3 символов.

5
ответ дан 17 July 2018 в 13:35

Содержание test.txt:

A 12"x4" dir/B b/C c A1/B1/C1 A2/B2/C2 A3/B3/C3

Сценарий для создания папок A[123]:

file="test.txt" while read -r line ; do mkdir "${line%%/*}" done < "$file"

Вывод ls:

A 12"x4" dir A1 A2 A3
6
ответ дан 17 July 2018 в 13:35

с использованием Perl:

perl -ne 'mkdir for /^(\w+)/' list.txt

Или

perl -ne 'mkdir for /^([^\/]+)/' list.txt

, если мы хотим принимать пробелы в именах dir

2
ответ дан 17 July 2018 в 13:35

Параллель GNU может быть слишком сложной для задачи, но если вы собираетесь делать другие вещи для каждой строки, тогда это может быть полезно:

cat myfile.txt | parallel --colsep / mkdir {1} parallel -a myfile.txt --colsep / mkdir {1}

Он корректно обрабатывает входные данные:

A 12"x4" dir/B b/C c
0
ответ дан 20 July 2018 в 13:40

Для простого примера, как показано в примере ввода вопроса, просто используйте cut и передайте вывод в mkdir через xargs

cut -f1 -d '/' file.txt | xargs -L1 mkdir

. Для обработки случаев, когда имя каталога может содержать пробелы, мы могли бы добавить -d '\n' в список опций:

$ cat input.txt A 1/B 1/C 1 A 2/B 2/C 2 A 3/B 2/C 2 $ cut -f1 -d '/' input.txt | xargs -d '\n' mkdir $ ls A 1 A 2 A 3 input.txt

Для более сложных вариаций, таких как A 12"x4" dir/B b/C c, как предложено @OleTange в комментариях, можно обратиться к awk, чтобы создать нулевой список вместо списка, разделенного новой строкой.

awk -F'/' '{printf "%s\0",$1}' input.txt | xargs -0 mkdir

@dessert в комментариях задается вопросом, можно ли использовать printf вместо cut и технически говорить его можно использовать, например, путем ограничения печатной строки только на ширину в 3 символа:

xargs -d '\n' printf "%.3s\n" < input.txt | xargs -L1 mkdir

Не самый чистый способ, но это доказывает, что printf можно использовать. Конечно, это становится проблематичным, если имя каталога становится длиннее 3 символов.

5
ответ дан 20 July 2018 в 13:40
  • 1
    Как вы справляетесь со входом вроде: A 12"x4" dir/B b/C c? – Ole Tange 25 May 2018 в 14:32
  • 2
    @OleTange См. Редактирование. – Sergiy Kolodyazhnyy 25 May 2018 в 17:54

Содержание test.txt:

A 12"x4" dir/B b/C c A1/B1/C1 A2/B2/C2 A3/B3/C3

Сценарий для создания папок A[123]:

file="test.txt" while read -r line ; do mkdir "${line%%/*}" done < "$file"

Вывод ls:

A 12"x4" dir A1 A2 A3
6
ответ дан 20 July 2018 в 13:40
  • 1
    Как вы справляетесь со входом вроде: A 12"x4" dir/B b/C c? – Ole Tange 25 May 2018 в 14:32
  • 2
    Оле Танге. Этот комментарий кажется совершенно вне сферы действия этого вопроса. – DocSalvager 31 May 2018 в 07:13

с использованием Perl:

perl -ne 'mkdir for /^(\w+)/' list.txt

Или

perl -ne 'mkdir for /^([^\/]+)/' list.txt

, если мы хотим принимать пробелы в именах dir

2
ответ дан 20 July 2018 в 13:40
  • 1
    perl -ne 'mkdir for /^([^\/]+)/' list.txt, чтобы покрывать пробелы в именах dir. Мне, наконец, нужно изучить Perl - спасибо! – dessert 25 May 2018 в 00:03

Другие вопросы по тегам:

Похожие вопросы: