Menggunakan rsync hanya untuk menghapus file asing

13

Apa cara terbaik untuk membandingkan dua struktur direktori dan menghapus file dan direktori asing di lokasi target?

Saya memiliki aplikasi galeri foto web kecil yang sedang saya kembangkan. Pengguna menambah & menghapus gambar menggunakan FTP. Perangkat lunak galeri web yang saya tulis membuat thumbnail baru dengan cepat, tetapi tidak berurusan dengan penghapusan. Apa yang ingin saya lakukan, adalah menjadwalkan perintah / skrip bash untuk mengurus ini pada interval yang telah ditentukan.

Gambar asli disimpan /home/gallery/images/dan diatur dalam album, menggunakan subdirektori. Thumbnail di-cache /home/gallery/thumbs/, menggunakan struktur direktori dan nama file yang sama dengan direktori gambar.

Saya sudah mencoba menggunakan yang berikut untuk mencapai ini:

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

yang akan berfungsi dengan baik jika semua thumbnail telah di-cache, tetapi tidak ada jaminan bahwa ini akan terjadi, ketika ini terjadi, direktori jempol memiliki gambar ukuran penuh asli disalin ke sana.

Bagaimana saya bisa mencapai yang terbaik yang saya coba lakukan?

Bryan
sumber

Jawaban:

8

Saya tidak berpikir rsyncadalah pendekatan terbaik untuk ini. Saya akan menggunakan bash one-liner seperti berikut:

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

Jika one-liner ini menghasilkan daftar file yang tepat, Anda kemudian dapat memodifikasinya untuk menjalankan rmperintah alih-alih echoperintah.

Tom Shaw
sumber
Terima kasih tom. Saya kira juga membersihkan direktori, saya harus menjalankannya untuk kedua kalinya, tetapi menentukan direktori dalam perintah, bukan file, dan mengganti gema dengan rmdir?
Bryan
@Bryan: Ya itu terdengar masuk akal. Anda harus mengubah bendera di finddan di [tes ]. Tentu saja, harap sangat berhati-hati dengan perintah yang saya berikan dan modifikasi apa pun, dan uji dengan saksama echo!
Tom Shaw
Terima kasih banyak, saya akan menerapkan jumlah gema yang banyak saat pengujian.
Bryan
1
Baru saja berpikir: Anda bisa menguji dengan "ls" juga untuk memastikan itu bekerja dengan baik dengan spasi putih. Semoga sukses.
Tom Shaw
34

Anda --existingjuga perlu :

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

Dari halaman 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
sumber
1
Jika ada kesalahan sama sekali, jawaban Anda yang luar biasa tidak akan berfungsi. Itu sebabnya Anda juga perlu menambahkan --ignore-errorsargumen. Itulah satu-satunya hal yang berhasil untuk saya. Terima kasih untuk --existingdan --ignore-existing! Saya menggunakan jawaban Anda sebagai dasar jawaban saya di sini .
LonnieBest
@LonnieBest Jika ada kesalahan, tidak genap rm, cpatau mvakan berfungsi seperti itulah kesalahannya: Mereka adalah masalah yang harus dilihat dan yang mencegah operasi dari menyelesaikan sukses. Anda dapat menginstruksikan sebagian besar alat untuk mengabaikan kesalahan (mis. -fUntuk rm) tetapi saya tidak melihat bagaimana itu relevan dengan pertanyaan atau jawaban ini.
Mecki