Ich habe eine TXT-Datei, die einen solchen Text enthält
A1/B1/C1
A2/B2/C2
A3/B3/C3
Ich möchte ein Skript, das die TXT-Datei für jede Zeile liest und dann ein Verzeichnis basierend auf dem ersten Wort erstellt (A1, A2, A3).
Ich habe ein Skript wie folgt erstellt:
file="test.txt"
while IFS='' read -r line
do
name="line"
mkdir -p $line
done <"$file"
Während ich es ausführe, erstellt es das Verzeichnis A1 und anschließend die Unterverzeichnisse B1 und C1. das gleiche passiert für eine andere Linie (A2 * und A3 *)
Was kann ich tun, um nur A1-, A2-, A3-Verzeichnisse zu erstellen?
Ich möchte den Namen nicht wie A1 / B1 / C1 mit dem Zeichen '/' machen. Ich möchte nur das Wort vor dem Zeichen '/' nehmen und es zum Verzeichnisnamen machen. Nur "A1" "A2" "A3".
quelle
xargs -a<(....)
eher als<dirlist.txt cut -d/ -f1 | xargs
?tr
Ansatz - ich habe gerade festgestellt, dassparallel
es standardmäßig abgedeckt ist.xargs -a<(....)
statt einer Pfeife - weil ich es so mag, so einfach ist das. :)<(...)
hilft auch bei Leerzeichen, daher ist es definitiv die bessere Wahl - ich glaube, niemand hat diesen Dateideskriptor verwendet.cut <dirlist.txt
statt nurcut dirlist.txt
?Sie müssen Ihr
IFS='/'
for festlegenread
und dann jedes erste Feld einer separaten Variablenfirst
und den Rest der Felder einer Variablen zuweisenrest
und nur den Wert des ersten Felds bearbeiten (oder Sie könnenread -ar array
ein einzelnes Array verwenden und"${array[0]}"
für den Wert des ersten Felds verwenden.):Oder in einer Zeile für diejenigen, die es mögen:
Oder erstellen Sie alle Verzeichnisse auf einmal:
Das ANSI-C-Angebot
$'...'
wird verwendet, um Verzeichnisnamen zu verarbeiten, die Sonderzeichen enthalten.Beachten Sie, dass das
_
(kann ein beliebiges Zeichen oder eine beliebige Zeichenfolge sein) am Ende argv [0] für das istbash -c '...'
und das$@
Testament den Rest der Parameter ab 1 enthält. ohne das im zweiten Befehl geht der erste Parameter zummkdir
verloren.Bei
${1%%/*}
Verwendung der Shell-Parameterersetzungserweiterung (POSIX sh / bash / Korn / zsh) wird die längstmögliche Übereinstimmung eines Schrägstrichs entfernt, gefolgt von irgendetwas bis zum Ende des Parameters, der in diese Zeile übergeht . Dies ist eine Zeile, die von xargs gelesen wird .Ps:
echo
vor demmkdir
, um diese Verzeichnisse zu erstellen.-d'\n'
durch,-0
wenn Ihre Liste durch NUL-Zeichen anstelle einer\n
Ewline getrennt ist (vorausgesetzt, in Ihrem Verzeichnisnamen ist / sind Zeilenumbrüche eingebettet).quelle
Inhalt von
test.txt
:Skript zum Erstellen von
A[123]
Ordnern:Ausgabe von
ls
:quelle
A 12"x4" dir/B b/C c
?Verwenden Sie für einen einfachen Fall, wie im Eingabebeispiel der Frage gezeigt, einfach
cut
die Ausgabe und übergeben Sie sie anmkdir
viaxargs
Für Fälle, in denen der Verzeichnisname Leerzeichen enthalten kann, können wir
-d '\n'
der Liste der Optionen Folgendes hinzufügen :Bei komplexeren Variationen, wie
A 12"x4" dir/B b/C c
sie von @OleTange in den Kommentaren vorgeschlagen wurden, können Sieawk
eine durch Null getrennte Liste anstelle einer durch Zeilenumbrüche getrennten Liste erstellen.@dessert in den Kommentaren fragte sich, ob
printf
es anstelle von verwendet werden kanncut
, und technisch gesehen kann es verwendet werden, zum Beispiel indem die gedruckte Zeichenfolge auf die Breite von nur 3 Zeichen begrenzt wird:Nicht der sauberste Weg, aber er beweist,
printf
dass er verwendet werden kann. Dies wird natürlich problematisch, wenn der Verzeichnisname länger als 3 Zeichen ist.quelle
A 12"x4" dir/B b/C c
?mit Perl:
Oder
wenn wir Leerzeichen in Verzeichnisnamen akzeptieren wollen
quelle
perl -ne 'mkdir for /^([^\/]+)/' list.txt
Leerzeichen in Verzeichnisnamen abdecken. Ich muss endlich Perl lernen - danke!GNU Parallel ist möglicherweise zu viel für die Aufgabe, aber wenn Sie für jede Zeile andere Aufgaben ausführen, kann dies hilfreich sein:
Es behandelt korrekt mit Eingaben wie:
quelle