Saya mencoba menemukan cara untuk memeriksa di dalam direktori tertentu untuk file duplikat (bahkan dengan nama yang berbeda) dan menggantinya dengan symlink yang menunjuk pada kejadian pertama. Saya sudah mencoba fdupes
tetapi hanya mencantumkan duplikat itu.
Itulah konteksnya: Saya menyesuaikan tema ikon sesuai dengan keinginan saya, dan saya telah menemukan banyak ikon, bahkan jika mereka memiliki nama dan lokasi berbeda di dalam folder induknya, dan digunakan untuk tujuan yang berbeda, pada dasarnya sama saja gambar. Karena menerapkan modifikasi yang sama dua puluh atau tiga puluh kali berlebihan ketika hanya satu yang benar-benar diperlukan, saya ingin menyimpan satu gambar dan menghubungkan semua gambar lainnya.
Sebagai contoh, jika saya menjalankan fdupes -r ./
di dalam direktori testdir
, itu mungkin kembali kepada saya hasil berikut:
./file1.png
./file2.png
./subdir1/anotherfile.png
./subdir1/subdir2/yetanotherfile.png
Dengan hasil ini, saya hanya ingin menyimpan file file1.png
, menghapus semua yang lain dan menggantinya dengan symlink yang menunjuk ke sana, sambil mempertahankan semua nama file asli. Jadi file2.png
akan mempertahankan namanya, tetapi akan menjadi tautan untuk file1.png
bukannya menjadi duplikat.
Tautan tersebut tidak boleh mengarah ke jalur absolut, tetapi harus relatif terhadap testdir
direktori induk ; yaitu yetanotherfile.png
akan menunjuk ke ../../file1.png
, bukan ke/home/testuser/.icons/testdir/file1.png
Saya tertarik pada solusi yang melibatkan GUI dan CLI. Itu tidak wajib untuk menggunakan fdupes
saya telah mengutipnya karena ini adalah alat yang saya tahu, tapi saya terbuka untuk solusi yang menggunakan alat lain juga.
Saya cukup yakin bahwa skrip bash untuk menangani semua ini seharusnya tidak terlalu sulit untuk dibuat, tetapi saya tidak cukup ahli untuk mengetahui cara menulisnya sendiri.
sumber
v1.51
(Ubuntu 14.04.2 LTS).jdupes
di github.com/jbruchon/jdupes memiliki-L
opsi untuk melakukan tautan keras set duplikat yang diinginkan.${line//…/}
bagian itu tidak berfungsi untuk saya, jadi saya melakukan cara yang lebih bersih untuk mendapatkan file "master" pertama ke hardlink.rsync
sistem file yang berbeda? Atau jika sistem file tidak mempertahankan hierarki, mis. Itu adalah server cadangan yang meletakkan semuanya di bawah/«machine-name»/...
? Atau jika Anda ingin memulihkan dari cadangan? Saya tidak bisa melihat bagaimana hardlink akan dipertahankan di sini. Softlink relatif akan memiliki peluang lebih baik untuk bertahan hidup, saya pikir.Jika Anda tidak suka banyak scripting maka saya dapat merekomendasikan rdfind . Yang akan memindai direktori yang diberikan untuk file duplikat dan menghubungkannya dengan hard atau soft. Saya telah menggunakannya untuk deduplicating direktori Ruby gems saya dengan sangat sukses. Ini tersedia di Debian / Ubuntu.
sumber
Saya memiliki situasi yang serupa, tetapi dalam kasus saya tautan simbolik harus mengarah ke jalur relatif sehingga saya menulis skrip python ini untuk melakukan trik:
Untuk setiap baris input (yang merupakan daftar file) skrip membagi daftar file (dipisahkan spasi), mendapatkan jalur relatif dari setiap file ke yang pertama dan kemudian membuat symlink.
sumber
Jadi, jawaban yang diberikan oleh arnefm (yang telah disalin di internet) tidak berurusan dengan spasi dalam nama file. Saya telah menulis skrip yang berkaitan dengan spasi dalam file.
Yang dilakukan adalah menemukan dupes dan menuliskannya PIPE yang dipisahkan menjadi file bernama 'file'.
Kemudian ia membaca file kembali, baris demi baris, menjadi sebuah array, dan setiap elemen dari array dibatasi oleh PIPE.
Ini kemudian mengulangi semua elemen non-pertama dari array, mengganti file dengan symlink ke elemen pertama.
File eksternal ('file') dapat dihapus, jika perintah fdupes dijalankan dalam subkulit, yang dibaca langsung oleh sementara, tetapi cara ini tampaknya lebih jelas.
sumber
Beberapa peringatan di depan:
fdupes -1r common/base/dir | while read -r -a line ; do ln -sf $(realpath --relative-to ${line[1]} ${line[0]}) ${line[1]}; done
Jika lebih dari 2 file adalah duplikat (mis. File1 file2 file3) maka kita perlu membuat symlink untuk setiap pasangan - perlakukan file1, file2 dan file1, file3 sebagai 2 kasus terpisah:
Mengeluarkan ini untuk secara otomatis menangani jumlah duplikat per baris yang sewenang-wenang akan membutuhkan sedikit usaha lebih banyak.
Pendekatan lain adalah dengan pertama-tama membuat symlink ke path absolut, kemudian mengubahnya:
Ini didasarkan pada jawaban oleh @Gilles: /unix//a/100955/77319
sumber