TL; DR:
Her ikisinde de bulunan srcve destşu şekilde kaldırılabilen tüm dosyalar dest:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Adım adım açıklama için aşağıya bakın.
Sorunu basitleştirme:
Geri almak istediğimiz komutun gerçekte ne yaptığını anlamak için, onu basitleştirerek başlıyoruz:
Geri almak istediğimiz komut
sudo cp From_SOURCE/* To_DESTINATION/
Nasıl geri alınacağını anlamak için sudoönemli değildir.
Ben dizin adlarını kullanacağız srciçin From_SOURCEve destiçin To_DESTINATION.
Şimdi emrimiz:
cp src/* dest/
Eğer srcdosyaları içeren f1, f2ve f3, ve dizinleri d1ve d2kabuk için bu komutu genişletir:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Seçenekleri gibi olmadan -r, -Rya da -akomut cpdizinleri kopyalamaz.
Bu, komutun her biri için bir hata göstererek onları dışarıda bırakacağı anlamına gelir:
$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'
Bu, yalnızca basit dosyaları kopyaladık ve dizinleri kopyalayamadık dest.
Hangi dosyaların kaldırılacağına karar verme:
Muhtemelen içindeki dosyalarla destaynı adda dosyalar vardı src. Bu durumda dosyaların üzerine yazılmıştır (1). Onlar için çok geç, üzgünüm. En son yedeklemeden geri alın.
Orada bulunan dosyalar ile ilgili olarak, yalnızca kopyalanan dosyaları kaldırmak istiyoruz. Bu dosyalar her iki dizinde de aynı ada ve aynı içeriğe sahiptir.
Bu yüzden bu dosyaları ararız:
İlk olarak, cdiçine giriyoruz src, çünkü aşağıdaki findkomutları daha basit hale getiriyor ve dest'in mutlak yoluna bir değişken ayarlıyor:
$ cd src
$ destdir="$(readlink -f dest)"
Ardından, src içindeki tüm dosyaları listeleriz:
$ find . -maxdepth 1 -type f
ve bulunan her dosya için cmp, dest'de aynı içeriğe sahip bir dosya olup olmadığını kontrol etmek için kullanın :
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print
Dosyaları dikkatlice kaldırma:
Bu dosyalar kaldırmak istediğimiz dosyalardır. Ancak emin olmak için önce onları farklı bir dizine taşıyoruz ve çalıştırmadan önce komutlara bakıyoruz:
$ toDelete=/tmp/toDelete ; mkdir -p "$toDelete"
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec echo mv -n "$destdir/{}" "$toDelete"/ \;
mv -n /path/to/dest/./f1 /tmp/toDelete/`
mv -n /path/to/dest/./f2 /tmp/toDelete/`
mv -n /path/to/dest/./f3 /tmp/toDelete/`
İyi görünüyor! Şimdi echogerçek mvkomutları çalıştırmak için dışarıda bırakabiliriz :
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Tüm dosyalar desto kopyalanan srcve hala aslında aynı srcve dest, şimdi /tmp/toDelete/, ve son bir kez göz aldıktan sonra kaldırılabilir.
Notlar:
(1) Önce sorarak dosyaların üzerine yazılmasını engelleyen cpbir takma ad olup olmadığını kontrol edin cp -i.