Usando o rsync para excluir apenas arquivos estranhos

13

Qual é a melhor maneira de comparar duas estruturas de diretório e excluir arquivos e diretórios estranhos no local de destino?

Eu tenho um pequeno aplicativo de galeria de fotos da Web que estou desenvolvendo. Os usuários adicionam e removem imagens usando FTP. O software de galeria da web que escrevi cria novas miniaturas rapidamente, mas não lida com exclusões. O que eu gostaria de fazer é agendar um script de comando / bash para cuidar disso em intervalos predefinidos.

As imagens originais são armazenadas /home/gallery/images/e organizadas em álbuns, usando subdiretórios. As miniaturas são armazenadas em cache /home/gallery/thumbs/, usando a mesma estrutura de diretório e nomes de arquivos que o diretório de imagens.

Eu tentei usar o seguinte para conseguir isso:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

o que funcionaria bem se todas as miniaturas já tivessem sido armazenadas em cache, mas não há garantia de que esse seria o caso; quando isso acontecer, o diretório thumb terá imagens originais em tamanho original copiadas para ele.

Como posso alcançar da melhor maneira o que estou tentando fazer?

Bryan
fonte

Respostas:

8

Eu não acho que rsyncé a melhor abordagem para isso. Eu usaria um one-liner do bash como o seguinte:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

Se essa linha única produzir a lista correta de arquivos, você poderá modificá-la para executar um rmcomando em vez de um echocomando.

Tom Shaw
fonte
Obrigado Tom. Eu acho que também para limpar os diretórios, eu precisaria executá-lo uma segunda vez, mas especificando diretórios nos comandos em vez de arquivos e substituindo o eco por rmdir?
31711 Bryan
@ Bryan: Sim, isso parece razoável. Você precisaria alterar as bandeiras no finde no [teste ]. Obviamente, tenha muito cuidado com o comando que eu lhe dei e quaisquer modificações, e teste completamente com echo!
Tom Shaw
Muito obrigado, aplicarei grandes quantidades de eco durante o teste.
Bryan
1
Pensei: você também poderia testar com "ls" para garantir que funcione bem com espaço em branco. Muitas felicidades.
Tom Shaw
34

Você precisa --existingtambém:

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

Na página de manual:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).
Joril
fonte
1
Se houver algum erro, sua resposta incrível não funcionará. É por isso que você também precisa adicionar o --ignore-errorsargumento. Essa é a única coisa que funcionou para mim. Obrigado por --existinge --ignore-existing! Eu usei sua resposta como base da minha resposta aqui .
LonnieBest
@LonnieBest Se houver erros, nem mesmo rm, cpou mvfuncionarão, é isso que são os erros: são problemas que devem ser observados e que impedem que as operações sejam concluídas com êxito. Você pode instruir a maioria das ferramentas a ignorar erros (por exemplo, -fpara rm), mas não vejo como isso é relevante para a pergunta ou esta resposta.
Mecki