Создать список каталогов

Создать список каталогов

У меня есть список имен в текстовом файле ( list.txt) Я хочу создать список папок для имен, включенных в этот файл. Я написал следующий скрипт, но он не работает, и я не знаю, в чем проблема:

#!/bin/tcsh
for name_id in `cat <path to list.txt>/list.txt` ; do
mkdir <name_id>${name_id}

Файл list.txtи скрипты находятся в одной папке.

решение1

Мне это помогло:

xargs mkdir <list.txt

Это работает, потому что если вы дадите ему несколько аргументов, mkdirон успешно создаст все каталоги, которые он может создать. xargsпросто «сглаживает» ваш текстовый файл, заменяя символы новой строки пробелами, тем самым вызывая mkdirдлинный список аргументов, содержащих все ваши имена каталогов сразу, а не по одному за раз.

Если вы хотите добавить фиксированный префикс (или суффикс, или и то, и другое):

xargs -I, mkdir prefix_, <list.txt

Все, что вы поставите после -Iпереключателя (в данном случае запятой), будет заменено именем, считанным из файла.

И еще одно: я бы добавил кавычки на тот случай, если имена файлов в вашем текстовом файле содержат пробелы или другие «специальные» символы:

xargs -I, mkdir "," <list.txt

или

xargs -I, mkdir "prefix_," <list.txt

решение2

В вашем примере ваши запутанные команды скриптинга оболочки. Вам следует обратить особое внимание на то, какой язык скриптинга вы используете, а затем придерживаться синтаксиса его команд. В вашем примере вы используете оболочку Turbo C (tcsh), однако затем вы смешиваете команды и синтаксисы оболочки Bash/Bourne.

Вы можете использовать следующий подход, если вы действительно хотите tcsh. Допустим, у меня есть этот файл-образец:

$ cat afile 
1
2
3
4
5

И этот сценарий:

$ cat cmd.csh 
#!/bin/tcsh

foreach i (`cat afile`) 
  echo "$i" 
end

Запуск приведет к следующему выводу:

$ ./cmd.csh
1
2
3
4
5

Итак, чтобы выполнить задачу, мы можем добавить mkdirкоманду после echo:

$ cat cmd1.csh 
#!/bin/tcsh

foreach i (`cat afile`) 
  echo "making directory: $i" 
  mkdir "$i"
end

Теперь, когда мы это запустим:

$ ./cmd1.csh 
making directory: 1
making directory: 2
making directory: 3
making directory: 4
making directory: 5

В результате будут созданы каталоги:

$ ls -l
total 32
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 1
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 2
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 3
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 4
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 5
-rw-rw-r--. 1 saml saml   11 Oct 16 18:47 afile
-rwxrwxr-x. 1 saml saml   86 Oct 16 18:56 cmd1.csh
-rwxrwxr-x. 1 saml saml   55 Oct 16 18:51 cmd.csh

решение3

Если у вас есть GNU Parallel, вы можете сделать:

parallel -q mkdir '<name_id>'{} < list.txt 

В отличие от xargs он корректно обрабатывает специальные символы, такие как <, >, ', " и пробел.

GNU Parallel — это универсальный распараллеливатель, позволяющий легко запускать задания параллельно на одной машине или на нескольких машинах, к которым у вас есть доступ по SSH.

Монтаж

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить персональную установку, которая не требует доступа root. Это можно сделать за 10 секунд, выполнив следующее:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Другие варианты установки см.http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Узнать больше

Смотрите больше примеров:http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Пройдите обучение:http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на рассылку, чтобы получить поддержку:https://lists.gnu.org/mailman/listinfo/parallel

решение4

Вам не нужен цикл. Вы можете сделать:

mkdir `sed 's/^/<name_id>/' <path to list.txt>/list.txt`

Связанный контент