Bir dizindeki aynı içeriğe sahip tüm klasörleri bulma


10

Ubuntu'da, bir dizinde yinelenen klasörler (yani aynı içeriğe sahip klasörler) bulmak için herhangi bir şey var mı? Zaten yinelenen dosyaları (fdupes gibi) bulmak için kullanılabilir bazı komut satırı araçları olduğunu düşünüyorum, ancak bunun yerine yinelenen klasörleri bulmak istiyorum. Yani, içerdikleri dosyaların içerikleriyle eşleşen klasörleri bulun (dosya adları ve diğer meta veriler farklı olsa da).


Bir dizindeki tüm klasörlerin bir listesini oluşturarak başlayabilirim (uzunluğa göre sıralanmış) ve sonra aynı uzunlukta her bir klasör çiftini kontrol edebilirim.
Anderson Green

"Çoğalt" ı tanımlayın. İçindeki dosyalar yalnızca dosya içeriğiyle eşleşmeli mi? Dosya adı? İnode numarası? Dosya boyutu?
Chris Down

@ChrisDown Soru güncellendi.
Anderson Green

3
Evet. Dizinler gerçekten sadece dosyalardır, bu yüzden ifadeniz belirsizdir. Gerçekte "aynı içeriğe" sahip olmak, dizinlerin her ikisinin de aynı inode referanslarını içerdiği anlamına gelir. Bunu kastettiğiniz anlamına mı yoksa içerideki dosyaların aynı içeriğe sahip olması gerektiği anlamına mı geldiyse ve başka şartlar (mtime, dosya adı vb.) Olup olmadığı belirsizdir .
Chris Down

3
@ChrisDown İçindeki dosyaların aynı içeriğe sahip olması gerektiği anlamına geliyor.
Anderson Green

Yanıtlar:


5
#!/bin/bash
shopt -s dotglob

for file in "$1"/*; do [[ -f "$file" ]] && d1+=( "$(md5sum < "$file")" ); done
for file in "$2"/*; do [[ -f "$file" ]] && d2+=( "$(md5sum < "$file")" ); done 

[[ "$(sort <<< "${d1[*]}")" == "$(sort <<< "${d2[*]}")" ]] && echo "Same" || echo "Different"

Burada çalışırken görebilirsiniz:

$ mkdir 1 2
$ ./comparedirs 1 2
Same
$ cat > 1/1 <<< foo
$ cat > 2/1 <<< foo
$ ./comparedirs 1 2
Same
$ cat > 2/1 <<< bar
$ ./comparedirs 1 2
Different

Bu senaryo test edilmediğinden, çalışması gerektiği gibi çalışıp çalışmadığını görmek için sabırsızlanıyorum.
Anderson Green

1
@AndersonGreen Güncellenmiş cevabı kontrol edin, test edin.
Chris Down

Güzel! Orada da bir test olmalıdır cat > 1/2 <<< barve cat > 2/3 <<< bar birden fazla dosya ve farklı meta verileri (== "Aynı") göstermek için
nealmcb

@ChrisDown: Son adımda sıralama gerekli mi?
harish.venkat

Zarif betik, sadece küçük bir hata, dizinlerden biri veya her ikisi de mevcut olmadığında aynı döndürür.
kosinüs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.