Erstellen Sie eine Liste mit Verzeichnissen

Erstellen Sie eine Liste mit Verzeichnissen

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.txtund 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 mkdirproblemlos alle Verzeichnisse erstellt, die es erstellen kann. xargsEs „glättet“ einfach Ihre Textdatei, indem es Zeilenumbrüche durch Leerzeichen ersetzt und so mkdireine 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 -ISchalter 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 mkdirBefehl 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`

verwandte Informationen