
У меня есть список имен в текстовом файле ( 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`