Verschieben von Dateien, die älter als ein Jahr sind, in das übergeordnete Archivverzeichnis

Verschieben von Dateien, die älter als ein Jahr sind, in das übergeordnete Archivverzeichnis

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, mvwelches 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 installdies 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

verwandte Informationen