
Ich habe eine Liste mit Namen in einer Textdatei ( list.txt
). Ich möchte eine Liste mit Ordnern für die in dieser Datei enthaltenen Namen erstellen. Ich habe das folgende Skript geschrieben, aber es funktioniert nicht und ich weiß nicht, was falsch ist:
#!/bin/tcsh
for name_id in `cat <path to list.txt>/list.txt` ; do
mkdir <name_id>${name_id}
Die Datei list.txt
und die Skripte befinden sich im selben Ordner.
Antwort1
Das hat bei mir funktioniert:
xargs mkdir <list.txt
Dies funktioniert, weil es bei Angabe mehrerer Argumente mkdir
problemlos alle Verzeichnisse erstellt, die es erstellen kann. xargs
Es „glättet“ einfach Ihre Textdatei, indem es Zeilenumbrüche durch Leerzeichen ersetzt und so mkdir
eine lange Liste von Argumenten aufruft, die alle Ihre Verzeichnisnamen auf einmal enthält, anstatt einen nach dem anderen.
Wenn Sie ein festes Präfix (oder Suffix oder beides) hinzufügen möchten:
xargs -I, mkdir prefix_, <list.txt
Was auch immer Sie nach dem -I
Schalter eingeben (in diesem Fall ein Komma), wird durch den Namen ersetzt, der aus der Datei gelesen wird.
Und noch etwas: Ich würde Anführungszeichen hinzufügen, nur für den Fall, dass die Dateinamen in Ihrer Textdatei Leerzeichen oder andere „Sonderzeichen“ enthalten:
xargs -I, mkdir "," <list.txt
oder
xargs -I, mkdir "prefix_," <list.txt
Antwort2
In Ihrem Beispiel verwirren Sie Shell-Skriptbefehle. Sie müssen besonders darauf achten, welche Skriptsprache Sie verwenden, und sich dann an die Syntax der Befehle halten. In Ihrem Beispiel verwenden Sie Turbo C Shell (tcsh), mischen dann jedoch Befehle und Syntax der Bash/Bourne-Shell ein.
Sie können den folgenden Ansatz verwenden, wenn Sie ihn wirklich wollen tcsh
. Angenommen, ich hätte diese Beispieldatei:
$ cat afile
1
2
3
4
5
Und dieses Skript:
$ cat cmd.csh
#!/bin/tcsh
foreach i (`cat afile`)
echo "$i"
end
Wenn Sie es ausführen, wird folgende Ausgabe erzeugt:
$ ./cmd.csh
1
2
3
4
5
Um die Aufgabe abzuschließen, können wir den mkdir
Befehl nach folgendem hinzufügen echo
:
$ cat cmd1.csh
#!/bin/tcsh
foreach i (`cat afile`)
echo "making directory: $i"
mkdir "$i"
end
Wenn wir es jetzt ausführen:
$ ./cmd1.csh
making directory: 1
making directory: 2
making directory: 3
making directory: 4
making directory: 5
Als Ergebnis werden die folgenden Verzeichnisse erstellt:
$ 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
Antwort3
Wenn Sie GNU Parallel haben, können Sie Folgendes tun:
parallel -q mkdir '<name_id>'{} < list.txt
Im Gegensatz zu xargs geht es korrekt mit Sonderzeichen um – wie <, >, ', " und Leerzeichen.
GNU Parallel ist ein allgemeiner Parallelisierer und erleichtert die parallele Ausführung von Jobs auf derselben Maschine oder auf mehreren Maschinen, auf die Sie per SSH-Zugriff zugreifen können.
Installation
Wenn GNU Parallel nicht für Ihre Distribution gepackt ist, können Sie eine persönliche Installation durchführen, für die kein Root-Zugriff erforderlich ist. Dies ist in 10 Sekunden erledigt, indem Sie Folgendes tun:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Weitere Installationsoptionen finden Sie unterhttp://git.savannah.gnu.org/cgit/parallel.git/tree/README
Erfahren Sie mehr
Weitere Beispiele:http://www.gnu.org/software/parallel/man.html
Sehen Sie sich die Einführungsvideos an:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Gehen Sie das Tutorial durch:http://www.gnu.org/software/parallel/parallel_tutorial.html
Melden Sie sich für die E-Mail-Liste an, um Unterstützung zu erhalten:https://lists.gnu.org/mailman/listinfo/parallel
Antwort4
Sie brauchen keine Schleife. Sie können Folgendes tun:
mkdir `sed 's/^/<name_id>/' <path to list.txt>/list.txt`