
Ich möchte die Fotos meiner Sammlung in ein Verzeichnis „/home/Bruno/Archiv/Bilder“ verschieben, das dem Verzeichnis „/home/Bruno/Bilder“ übergeordnet ist.
Ich habe angefangen mit:
find -ctime +365 -exec echo mv '{}' ../Archiv/Bilder/'{}' \; | bash
Aber find schließt den Punkt für das aktuelle Verzeichnis in die {} ein. Daher erhalte ich:
mv ./2013/01/19/DSC_0141.JPG ../Archiv/Bilder/./2013/01/19/DSC_0141.JPG
mv: das Verschieben von »./2013/01/23/IMG_0052.JPG“ nach »../Archiv/Bilder/./2013/01/23/IMG_0052.JPG“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden
Also habe ich den Punkt entfernt, der die Verwendung von sed ermöglicht:
find -ctime +577 -exec echo mv '{}' ../Archiv/Bilder/'{}' \; | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash
Aber ich erhalte die gleiche Fehlermeldung:
mv: das Verschieben von »./2013/01/10/IMG_0141.JPG“ nach »../Archiv/Bilder/2013/01/10/IMG_0141.JPG“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden
Also wollte ich zu rsync wechseln, um die Arbeit zu erledigen:
find -ctime +577 -exec echo rsync -n --remove-source-files '{}' ../Archiv/Bilder/'{}' \; | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash
Und rsync schlägt fehl, aber es wird viel ausführlicher darüber berichtet:
rsync: change_dir#3 "/home/Bruno/Bilder//../Archiv/Bilder/2013/01/10" failed: No such file or directory (2)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(712) [Receiver=3.1.0]
Was mache ich hier falsch?
Antwort1
Ihr Find-Befehl stößt auf das Problem, dass die Zwischenverzeichnisse (in diesem Fall /home/Bruno/Archiv/Bilder/2013/01/23/
) noch nicht erstellt wurden. Das hat nichts mit dem (harmlosen) ' .
' in Ihrem Pfad zu tun.
Entweder musst Du zuerst die komplette Verzeichnisstruktur zum Ziel anlegen oder ein kleines Script erstellen, welches Du stattdessen aufrufst, mv
welches zuerst das Zielverzeichnis anlegt und dann den Umzug durchführt.
mkdirmv
:
#!/bin/sh
mkdir -p -- "$(dirname $2)"
mv -- "$1" "$2"
Antwort2
Zur späteren Bezugnahme – Sie können install
dies direkt tun:
install -D ./2013/01/10/IMG_0141.JPG ../Archiv/Bilder/2013/01/10/IMG_0141.JPG
Hinweis: Damit dies funktioniert, müssen Sie den Dateipfad im zweiten Argument anhängen. Mit anderen Worten:
Falsch:
find . -ctime +365 -exec install -D '{}' ../Archiv/Bilder/ \;
Richtig:
find . -ctime +365 -exec install -D '{}' '../Archiv/Bilder/{}' \;
Laut Manpage von install
:
-D Erstellt alle führenden Komponenten von DEST außer der letzten und kopiert dann SOURCE nach DEST