Verschieben von Verzeichnissen, deren Namen mit - Nummer enden, die einer list.txt-Datei entspricht

Verschieben von Verzeichnissen, deren Namen mit - Nummer enden, die einer list.txt-Datei entspricht

Grafik der Ordnerstruktur:

Bildbeschreibung hier eingeben

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 Destinationund 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.txtZeile für Zeile. Für jede Zeile $lversucht es, das Verzeichnis mit dem Namen Source/Car$lnach zu verschieben Destination/..

Der Punkt als Pfadname-Komponente Destination/.ist ein Trick, falls Destinationnicht vorhanden ist. Wenn Destinationnicht 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 whileerkennt diese Schleife die letzte Zeile nicht?).

verwandte Informationen