Ich habe einen Ordner mit dem Namen /home/user/temps
487 Ordner. In jedem Ordner habe ich eine Datei namens thumb.png.
Ich möchte alle Dateien mit dem Namen thumb.png in einen separaten Ordner kopieren und sie basierend auf dem Ordner, aus dem sie stammen, umbenennen.
Antworten:
Bitte schön:
bearbeiten:
Die kanonische Weisheit ist übrigens, dass
find
es eine schlechte Idee ist, dies zu tun - die einfache Verwendung der Shell-Erweiterung ist viel zuverlässiger. Auch dies setzt vorausbash
, aber ich denke, das ist eine sichere Annahme :)2 bearbeiten:
Der Klarheit halber werde ich es aufschlüsseln:
Details zum
${var/Pattern/Replacement}
Konstrukt finden Sie hier .Die Anführungszeichen in der
cp
Zeile sind wichtig, um Leerzeichen, Zeilenumbrüche usw. in Dateinamen zu behandeln.quelle
new_file/\/thumb
?${VARIABLE/PATTTERN/REPLACEMENT}
Erzeugt den Wert vonVARIABLE
, wobei das Muster durch den Ersetzungstext ersetzt wird. Hier ist das Muster/thumb
(das/
muss maskiert werden, damit es nicht so aussieht${new_file//PATTERN/REPLACEMENT}
, was es zu einer globalen Ersetzung anstelle einer Ersetzung beim ersten Auftreten macht) und der Ersetzungstext ist leer./home/user/temps
, was sich aus der Frage nicht ergibt. Wenn nicht, müssen Sie oder finden**
.Dies funktioniert für beliebig tiefe Unterverzeichnisse:
Der interessante Teil ist die Parametererweiterung
${NAME//\//_}
. Es nimmt den Inhalt vonNAME
und ersetzt jedes Vorkommen von/
mit_
.Hinweis: Das Ergebnis ist abhängig vom Arbeitsverzeichnis und dem Pfadparameter für find. Ich habe den Befehl aus dem übergeordneten temporären Verzeichnis ausgeführt. Ersetzen Sie
cp
durch, umecho
zu experimentieren.quelle
Kurzer Hilfecode:
Nennen wir es 'deslash.sh' und machen es ausführbar. Nennen Sie es mit:
Es wird fehlschlagen, wenn eine Kollision vorliegt
aber das ist unvermeidlich.
quelle
Versuche dies
Bearbeiten
Ich habe Anführungszeichen hinzugefügt, falls in einem Ihrer Verzeichnisnamen Leerzeichen eingebettet sind.
Auch ich habe dies geändert, so dass nur die auszuführenden Befehle ausgedruckt werden. Untersuchen Sie die Ausgabe des Skripts, um sicherzustellen, dass alle Dateien / Pfadnamen korrekt aussehen. Wenn Sie sicher sind, dass es keine Probleme mit den auszuführenden Befehlen gibt, entfernen Sie die
echo
.quelle
mv -i ./A A/thumb.png ../tmp/.png
- Alle Dateien enden in ../tmp/.png (../tmp ist mein Zielverzeichnis).find -type d
und die Ausgabe sehen. Enthält das alle Verzeichnisse, die Sie erwarten? Sollte dies nicht der Fall sein, fügen Sie bitte eine Ausgabe hinzu, um das Problem anzuzeigen. Viel Glück.read dir
führt die Wortteilung durch und nimmt aus einem Verzeichnisa\nb
a und b zwei Instanzen, die keine Maskierung lösen kann.Zum Kopieren benötigen Sie den Befehl cp und zum Umbenennen unter Linux müssen Sie die Datei mit dem Befehl mv verschieben . Unter Linux müssen Sie immer den gesamten Pfad angeben, von der Quelle, wenn Sie sich in einem anderen Ordner befinden, und natürlich zum Zielordner. Ich würde so etwas für die Kopie sein:
oder umbenennen oder verschieben
quelle
find