Grafik der Ordnerstruktur:
Ich bin sehr neu im Umgang mit erweiterten Shell-Befehlen und Skripten. Ich habe grundlegende Terminalkenntnisse, habe aber noch nie versucht, eine Automatisierung wie diese zu erstellen. Ein absoluter Neuling.
Ich habe mein Ziel in diesem Beitrag vereinfacht, aber das eigentliche Projekt würde sich auf einige Tausend Ordner erstrecken.
Im Grunde habe ich einen Quell- und einen Zielordner. Der Quellordner enthält Verzeichnisse mit dem Präfix „Auto“, gefolgt von „drei Zahlen“.
Ich habe eine Textdatei namens list.txt im Quellordner, die eine Liste mit „drei Zahlen“ pro Zeile ist.
Ich möchte entweder einen Befehl oder ein Skript schreiben, das Verzeichnisse findet und die Liste liest. Wenn die letzten drei Ziffern im Verzeichnisnamen mit den drei Ziffern in der Liste übereinstimmen, möchte ich die übereinstimmenden Ordner in den Zielordner verschieben.
Ich habe eine Vielzahl von Methoden mit find, -exec mv, xargs, „while IFS read“ gelesen und weiß wirklich nicht, wie ich das am besten angehen soll. Ich fange gerade erst an und hoffe, dass jemand in diesem Forum etwas dazu sagen kann und mich nicht fertigmacht.
Antwort1
Ein Skript, das im übergeordneten Verzeichnis von Destination
und Source
( .
in Ihrem Bild) ausgeführt wird:
#!/bin/sh
while IFS= read -r l; do
mv "Source/Car$l/" Destination/.
done < Source/list.txt
Dieses Skript liest Source/list.txt
Zeile für Zeile. Für jede Zeile $l
versucht es, das Verzeichnis mit dem Namen Source/Car$l
nach zu verschieben Destination/.
.
Der Punkt als Pfadname-Komponente Destination/.
ist ein Trick, falls Destination
nicht vorhanden ist. Wenn Destination
nicht vorhanden, wird das erste in mv "Source/Car…/" Destination/
umbenannt , anstatt es in einzufügen . Der Punkt macht einen Unterschied: Wenn das Ziel vorhanden ist und nicht vorhanden ist, werden unsere Befehle mit einem Fehler beendet.Source/Car…/
Destination/
Destination/
Destination/.
Destination/
mv
Das Skript istdumm, es führt keine Plausibilitätsprüfung für das durch, was es liest Source/list.txt
. Wenn beispielsweise eine Zeile ist 001/../../../../../../../../../../home/roco/.ssh
, verschiebt das Skript Ihr ~/.ssh/
Verzeichnis möglicherweise nach Destination/
. Wenn eine leere Zeile vorhanden ist, versucht das Skript, nach zu verschieben Source/Car/
. Wenn die letzte Zeile unvollständig ist, gelangt es nicht nach mv
(sieheWarum while
erkennt diese Schleife die letzte Zeile nicht?).