Siduction Forum
Siduction Forum => Scripting & Kernelhacking => Topic started by: cas on 2018/06/25, 15:27:54
-
Hallo,
ich muss häufig viele Verzeichnisse erzeugen. Das möchte ich automatisieren.
Die Namen der Verzeichnisse stehen in einer Textdatei namens 'toc.txt', zB
Verz1
Verz2
Verz3
oder auch in einer Zeile
Verz1 Verz2 Verz3
Solange die Verzeichnisnamen aus _einem_ Wort bestehen, kann ich
mkdir $( cat toc.txt )
eingeben.
Häufig sieht toc.txt aber so aus:
Verz mit mehreren Worten
AnderesVerz aus versch Worten
Wie kann ich also jede Zeile als einen GesamtString ausgeben und diesen dem mkdir-Befehl übergeben?
Mit einfachen oder doppelten Anführungszeichen bin ich nicht weitergekommen.
Bis jetzt helfe ich mir so:
"Verz mit mehreren Worten" "AnderesVerz aus versch Worten"
dh die Namen werden mit Anführungszeichen eingeklammert und alles in einer Zeile. Schliesslich wird mit Cut&Paste diese Zeile mkdir übergeben.
Ich hoffe, dass dies einfacher geht
Grüße, C
-
#!/bin/bash
IFS=$'\n'
for i in `sed "/*/p" < toc.txt`
do
mkdir $i
done
Als Beispiel mit sed, sollte aber auch mit cat gehen. Der Trick ist den InputFieldSeperator von "alle whitespaces" auf "Zeilenumbruch" zu setzen. Verfeinern in der Form das der Listenname übergeben werden kann und irgendwelche Rückmeldungen überlasse ich dir.
-
Und wat der @Geier0815 vergessen hat - ganz wichtig - den IFS wieder zurücksetzen nach der Verarbeitung - immer, ob man es grad braucht oder nicht - das muss in Fleisch und Blut übergehen, sonst schießt man sich damit früher oder später fürchterlich ins Knie. (Fragt nicht nach, ich weiss, wovon ich rede ... ;))
-
Besten Dank!
Sofern die Verzeichnisnamen mit Anführungszeichen eingeklammert sind, geht auch
cat toc.txt | xargs mkdir
Grüße, C
-
IFS wieder zurücksetzen nach der Verarbeitung
Ich nehme an, dieses Zurücksetzen läuft per
IFS=$' \t\n'
habe gerade mal nachgesehen. Da scheint es mehrere falsche Möglichkeiten zu geben
-
Wenn man es als no-brainer haben will
OLDIFS=$IFS
IFS=foo
Verarbeitung
IFS=$OLDIFS
Ausführlicher hier: https://stackoverflow.com/questions/4128235/what-is-the-exact-meaning-of-ifs-n
-
Ich mag mich ja täuschen aber da für das Skript eine Subshell erzeugt wird und diese nichts an den Elternprozess durch reicht, sollte mit Beendigung des Skripts IFS in der aufrufenden Shell unberührt sein. Oder sitze ich da einem Irrtum auf?
Aber sicherlich ist es nicht verkehrt sich um so etwas Gedanken zu machen, der Teufel ist bekanntlich ein Eichhörnchen. Es gibt ja auch skript-Aufrufe die es direkt in der aktuellen shell ausführen. Von daher: Danke für den ergänzenden Hinweis.
-
Ich mag mich ja täuschen aber da für das Skript eine Subshell erzeugt wird und diese nichts an den Elternprozess durch reicht, sollte mit Beendigung des Skripts IFS in der aufrufenden Shell unberührt sein. Oder sitze ich da einem Irrtum auf?
Du irrst Dich nicht - und dann nimmst Du den Schnipsel und baust ihn irgendwo anders ein oder erweiterst das Script - ist mir nicht nur einmal passiert :D