J'ai une list de noms dans un file text ( list.txt
) Je veux créer une list de dossiers pour les noms inclus dans ce file. J'ai écrit le script suivant, mais ça ne marche pas et je ne sais pas ce qui ne va pas:
#!/bin/tcsh for name_id in `cat <path to list.txt>/list.txt` ; do mkdir <name_id>${name_id}
Le file list.txt
et les scripts se trouvent dans le même dossier.
Cela a fonctionné pour moi:
xargs mkdir <list.txt
Cela fonctionne car si vous donnez plusieurs arguments à mkdir
il créera heureusement tous les directorys qu'il peut créer. xargs
«flatte» simplement votre file text en remplaçant les returns par des espaces, invoquant ainsi mkdir
avec une longue list d'arguments contenant tous vos noms de directorys à la place d'un à la fois.
Si vous souhaitez append un préfixe fixe (ou suffixe, ou les deux):
xargs -I, mkdir prefix_, <list.txt
Quoi que vous mettiez après le changement -I
(une virgule dans ce cas) est remplacé par le nom qui est lu dans le file.
Encore une chose, je voudrais append des citations juste au cas où les noms de files dans votre file text ont des espaces dans eux ou d'autres caractères «spéciaux»:
xargs -I, mkdir "," <list.txt
ou
xargs -I, mkdir "prefix_," <list.txt
Dans votre exemple, vos commands de script shell déroutantes. Vous devez accorder une attention particulière au langage de script que vous utilisez, puis respecter la syntaxe de ses commands. Dans votre exemple, vous utilisez le shell turbo C (tcsh), mais vous mélangez alors les commands et les syntaxes du shell Bash / Bourne.
Vous pouvez utiliser l'approche suivante si vous voulez vraiment tcsh
. Dis que j'ai eu ce file d'exemple:
$ cat afile 1 2 3 4 5
Et ce script:
$ cat cmd.csh #!/bin/tcsh foreach i (`cat afile`) echo "$i" end
Exécuter cela produira cette sortie:
$ ./cmd.csh 1 2 3 4 5
Pour compléter la tâche, nous pouvons append dans la command mkdir
après l' echo
:
$ cat cmd1.csh #!/bin/tcsh foreach i (`cat afile`) echo "making directory: $i" mkdir "$i" end
Maintenant quand nous l'exécutons:
$ ./cmd1.csh making directory: 1 making directory: 2 making directory: 3 making directory: 4 making directory: 5
Résultat de la création des directorys:
$ 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
Si vous avez GNU Parallel vous pouvez faire:
parallel -q mkdir '<name_id>'{} < list.txt
Opposé xargs il traite correctement avec des caractères spéciaux – tels que <,>, ', "et l'espace.
GNU Parallel est un paralléliseur général et il est facile d'exécuter des tâches en parallèle sur la même machine ou sur plusieurs machines auxquelles vous avez access ssh.
Installation
Si GNU Parallel n'est pas fourni pour votre dissortingbution, vous pouvez effectuer une installation personnelle qui ne nécessite pas d'access root. Cela peut se faire en 10 secondes en faisant ceci:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Pour d'autres options d'installation, voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Apprendre encore plus
Voir plus d'exemples: http://www.gnu.org/software/parallel/man.html
Regardez les videos d'intro: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Parcourez le tutoriel: http://www.gnu.org/software/parallel/parallel_tutorial.html
Inscrivez-vous à la list des courriels pour get de l'aide: https://lists.gnu.org/mailman/listinfo/parallel
Vous n'avez pas besoin d'une boucle. Tu peux faire:
mkdir `sed 's/^/<name_id>/' <path to list.txt>/list.txt`
Ce code a très bien fonctionné pour moi:
#!/bin/bash while read i; do echo "$i" wait mkdir "$i" done < lis.txt