Mover archivos de más de un año al directorio de archivo principal

Mover archivos de más de un año al directorio de archivo principal

Quiero mover las fotos de mi colección a un directorio "/home/Bruno/Archiv/Bilder", que es padre del directorio "/home/Bruno/Bilder".

Empecé con:

find  -ctime +365 -exec echo mv '{}' ../Archiv/Bilder/'{}' \; | bash

Pero buscar incluye el punto para el directorio actual en {}. Entonces obtengo:

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

Entonces eliminé el punto del uso de sed:

find  -ctime +577 -exec echo mv '{}' ../Archiv/Bilder/'{}' \;  | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash

Pero me sale el mismo error:

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

Entonces quería cambiar a rsync para hacer el trabajo:

find  -ctime +577 -exec echo rsync -n --remove-source-files '{}' ../Archiv/Bilder/'{}' \;  | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash

Y rsync falla, pero es mucho más detallado al respecto:

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]

¿Qué estoy haciendo mal aquí?

Respuesta1

Su comando de búsqueda se encuentra con el problema de que los directorios intermedios (en este caso /home/Bruno/Archiv/Bilder/2013/01/23/) aún no se han creado. Eso no tiene nada que ver con los (inofensivos) ' .' en tu camino.

Primero debe crear toda la estructura del directorio para el destino o crear un pequeño script al que llame en lugar de mvcrear primero el directorio de destino y luego realizar el movimiento.

mkdirmv:

#!/bin/sh
mkdir -p -- "$(dirname $2)"
mv -- "$1" "$2"

Respuesta2

Para referencia futura, puede utilizar installpara hacer esto directamente:

install -D ./2013/01/10/IMG_0141.JPG ../Archiv/Bilder/2013/01/10/IMG_0141.JPG

Nota: debe agregar la ruta del archivo en el segundo argumento para que esto funcione. En otras palabras:

Incorrecto:

find . -ctime +365 -exec install -D '{}' ../Archiv/Bilder/ \;

Correcto:

find . -ctime +365 -exec install -D '{}' '../Archiv/Bilder/{}' \;

Según la página de manual de install:

-D crea todos los componentes principales de DEST excepto el último, luego copia SOURCE a DEST

información relacionada