Mover arquivos com mais de um ano para o diretório do arquivo pai

1

Eu quero mover as fotos da minha coleção para o diretório "/ home / Bruno / Archiv / Bilder", que é o diretório pai do diretório "/ home / Bruno / Bilder".

Eu comecei com:

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

Mas o find inclui o ponto do diretório atual no {}. Então eu fico:

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

Então eu tirei o ponto de usar sed:

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

Mas recebo o mesmo erro:

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

Então, eu queria migrar para o rsync para fazer o trabalho:

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

E o rsync falha, mas é muito mais detalhado:

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]

O que estou fazendo de errado aqui?

    
por Bruno 05.10.2014 / 10:29

2 respostas

1

Seu comando find é executado no problema de que os diretórios intermediários (neste caso, /home/Bruno/Archiv/Bilder/2013/01/23/ ) ainda não foram criados. Isso não tem nada a ver com o (inofensivo) ' . ' no seu caminho.

Você precisa primeiro criar toda a estrutura de diretórios para o destino ou criar um script pequeno para o qual chame, em vez de mv , que primeiro cria o diretório de destino e, em seguida, faz a movimentação.

mkdirmv :

#!/bin/sh
mkdir -p -- "$(dirname $2)"
mv -- "$1" "$2"
    
por 05.10.2014 / 11:04
1

Para referência futura, você pode usar install para fazer isso diretamente:

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

Nota: você precisa anexar o caminho do arquivo no segundo argumento para que isso funcione. Em outras palavras:

Incorreto :

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

Correto :

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

De acordo com a página man de install :

-D create all leading components of DEST except the last, then copy SOURCE to DEST

    
por 05.10.2014 / 16:32

Tags