TL; DR:
Her ikisinde de bulunan src
ve 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 src
için From_SOURCE
ve dest
için To_DESTINATION
.
Şimdi emrimiz:
cp src/* dest/
Eğer src
dosyaları içeren f1
, f2
ve f3
, ve dizinleri d1
ve d2
kabuk için bu komutu genişletir:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Seçenekleri gibi olmadan -r
, -R
ya da -a
komut cp
dizinleri 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 dest
aynı 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, cd
içine giriyoruz src
, çünkü aşağıdaki find
komutları 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 echo
gerçek mv
komutları ç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 dest
o kopyalanan src
ve hala aslında aynı src
ve 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 cp
bir takma ad olup olmadığını kontrol edin cp -i
.