
Quero mover as fotos da minha coleção para um diretório "/home/Bruno/Archiv/Bilder", que é pai do diretório "/home/Bruno/Bilder".
Comecei com:
find -ctime +365 -exec echo mv '{}' ../Archiv/Bilder/'{}' \; | bash
Mas find inclui o ponto do diretório atual em {}. Então eu entendo:
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 eliminei 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 mudar 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?
Responder1
Seu comando find enfrenta o 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ê deve primeiro criar toda a estrutura de diretórios para o destino ou criar um pequeno script que você chama, em vez de mv
primeiro criar o diretório de destino e depois fazer a movimentação.
mkdirmv
:
#!/bin/sh
mkdir -p -- "$(dirname $2)"
mv -- "$1" "$2"
Responder2
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:
Incorreta:
find . -ctime +365 -exec install -D '{}' ../Archiv/Bilder/ \;
Correto:
find . -ctime +365 -exec install -D '{}' '../Archiv/Bilder/{}' \;
De acordo com a página de manual de install
:
-D cria todos os componentes principais de DEST, exceto o último, e então copia SOURCE para DEST