Utilizzo di rsync per eliminare solo file estranei


13

Qual è il modo migliore per confrontare due strutture di directory ed eliminare file e directory estranei nella posizione di destinazione?

Ho una piccola app per la galleria di foto per il web che sto sviluppando. Gli utenti aggiungono e rimuovono le immagini tramite FTP. Il software della galleria web che ho scritto crea nuove anteprime al volo, ma non si occupa delle eliminazioni. Quello che vorrei fare è programmare uno script command / bash per occuparsene a intervalli predefiniti.

Le immagini originali vengono archiviate /home/gallery/images/e organizzate in album, utilizzando le sottodirectory. Le anteprime vengono memorizzate nella cache /home/gallery/thumbs/, utilizzando la stessa struttura di directory e nomi di file della directory delle immagini.

Ho provato a utilizzare quanto segue per raggiungere questo obiettivo:

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

che funzionerebbe benissimo se tutte le anteprime fossero già state memorizzate nella cache, ma non vi è alcuna garanzia che ciò avvenga, quando ciò accade, la directory delle miniature contiene immagini originali a dimensione intera.

Come posso realizzare al meglio ciò che sto cercando di fare?

Risposte:


8

Non credo rsyncsia l'approccio migliore per questo. Vorrei usare un bash one-liner come il seguente:

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

Se questo one-liner produce il giusto elenco di file, è possibile modificarlo per eseguire un rmcomando anziché un echocomando.


Grazie Tom. Immagino che anche per pulire le directory, dovrei eseguirlo una seconda volta, ma specificando le directory nei comandi anziché i file e sostituendo l'eco con rmdir?
Bryan,

@Bryan: Sì, sembra ragionevole. Dovresti cambiare le bandiere nel finde nel [test ]. Certo, per favore stai molto attento sia con il comando che ti ho dato sia con qualsiasi modifica, e prova accuratamente con echo!
Tom Shaw,

Molte grazie, applicherò copiose quantità di eco durante i test.
Bryan,

1
Ho pensato: puoi anche provare con "ls" per assicurarti che funzioni bene con gli spazi bianchi. Auguri.
Tom Shaw,

34

Hai --existinganche bisogno di :

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

Dalla manpage:

  --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).

1
Se ci sono errori, la tua fantastica risposta non funzionerà. Ecco perché è necessario aggiungere anche l' --ignore-errorsargomento. Questa è l'unica cosa che ha funzionato per me. Grazie per --existinge --ignore-existing! Ho usato la tua risposta come base della mia risposta qui .
LonnieBest,

1
@LonnieBest Se ci sono errori, nemmeno rm, cpo mvfunzionerà come è quello che sono gli errori: sono problemi che dovrebbero essere esaminati e che impediscono il corretto completamento delle operazioni. Puoi dare istruzioni alla maggior parte degli strumenti di ignorare gli errori (ad es. -fPer rm) ma non vedo quanto sia rilevante per la domanda o questa risposta.
Mecki
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.