yalnızca dosya adlarını çıktılamak için fark


244

Yinelenen iki dizin karşılaştırmak ve sadece farklı olan dosya adlarını çıktı bir Linux komutu çalıştırmak için arıyorum . Bu, bir dizinde bulunan, diğerinde olmayan veya tam tersi olan her şeyi ve metin farklılıklarını içerir.

Yanıtlar:


376

Fark sayfaından:

-q   Yalnızca dosyaların farklı olup olmadığını bildirin, farklılıkların ayrıntılarını değil.
-r   Dizinleri karşılaştırırken, bulunan alt dizinleri özyinelemeli olarak karşılaştırın.

Örnek komut:

diff -qr dir1 dir2

Örnek çıktı (yerel ayara bağlı olarak):

$ ls dir1 dir2
dir1:
same-file  different  only-1

dir2:
same-file  different  only-2
$ diff -qr dir1 dir2
Files dir1/different and dir2/different differ
Only in dir1: only-1
Only in dir2: only-2

Teşekkürler - diffCentOS 7'deki man sayfası, -q"yalnızca dosyalar farklı olduğunda rapor et" olarak tanımlar ; bu, yazdıklarınızdan daha az açıktır.
Chap

2
Bu, dosyaların gerçek içeriğini karşılaştırır, bu genellikle kişinin istediği şeydir, ancak rsync yanıtı, içeriğe değil, yalnızca dosya adlarına ve boyutlarına bakma seçeneği sunar; bu bazen istenir.
steveb

MacOS üzerinde de çalışır.
Marius Soutier

Ayrıca, -x PATTERNbelirli alt dizinleri hariç tutmak için komut içerebilir . Örneğin, diff -qr repo1 repo2 -x ".git" iki dizini karşılaştırır , ancak dosya yollarını ".git" ile hariç tutar.
ViFI

27

Ayrıca rsync kullanabilirsiniz

rsync -rv --size-only --dry-run /my/source/ /my/dest/ > diff.out

6
--size-onlyaynı boyutta ancak farklı içerikteki dosyaları kaçıracaktır, örneğin eski / sürüm.txt "29a" yeni / sürüm.txt "29b" . Bunun yerine şunu kullanın: rsync -ric --dry-run old/ new/"-i" bağımsız değişkeni, dosya listesini doğrudanrsync -ric --dry-run old/ new/ | cut -d" " -f 2
iolsmit

6
Yalnızca eksik dosyaları (özellikle ağ paylaşımlarında) arıyorsanız, bu harika çünkü içerikleri karşılaştırmıyor. Bu, yeni bir NAS'a taşınırken başarısız olan birkaç dosyayı bulmama yardımcı oldu.
OverZealous

4
Rsync'in komut satırında belirtilen yollar için eğik çizgi eklediğinizden emin olun. Bunlar olmadan, bu düzgün çalışmaz ve rsync muhtemelen tüm dosya adlarını numaralandırır!
Vladimir Panteleev

2
İçeriği kontrol etmeme hakkındaki yorumlar ile ilgili. Bu bazen istenir, en azından ilk geçiş olarak.
steveb

13

Alt dizinlerinde değil, yalnızca dosya adlarında yalnızca bir dizinde bulunan dosyaların listesini almak istiyorsanız:

diff -q /dir1 /dir2 | grep /dir1 | grep -E "^Only in*" | sed -n 's/[^:]*: //p'

Tam yollarından farklı olan tüm dosyaları ve dizinleri özyinelemeli olarak listelemek istiyorsanız:

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}'

Bu şekilde tüm dosyalara farklı komutlar uygulayabilirsiniz.

Örneğin dir1 ama dir2 değil tüm dosyaları ve dizinleri kaldırabilirsiniz:

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}' xargs -I {} rm -r {}

9

Linux sistemimde sadece dosya adlarını almak için

diff -q /dir1 /dir2|cut -f2 -d' '

7
Linux sistemime boşluklu dosya adları koymuyorum. ;)
gerardw 4:14

6
Sana bunu ima etmek istememiştim ... ;-p Yapan biri için bir ipucu olarak ...
michuelnik

benim için çalışmıyor. Benim dizin yapısı aşağıdaki gibidiraudit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
Alex Raj Kaliamoorthy

diff -qrN /dir1 /dir2 | cut -f2 -d' 'benim için iyi çalışıyor!
Francesco

9

Çalıştırma yaklaşımının diff -qr old/ new/büyük bir dezavantajı vardır: yeni oluşturulan dizinlerdeki dosyaları kaçırabilir. Örneğin, aşağıdaki örnekte dosya data/pages/playground/playground.txtçıktısında değil diff -qr old/ new/iken data/pages/playground/( hızlı bir şekilde karşılaştırmak için tarayıcınızda playground.txt dosyasını arayın ). Ayrıca aşağıdaki çözümü Unix ve Linux Stack Exchange'de yayınladım , ancak burada da kopyalayacağım:

Programlı olarak yeni veya değiştirilmiş dosyaların bir listesini oluşturmak için gelebileceğim en iyi çözüm rsync , sort ve uniq kullanmaktır :

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

Bu örnekle açıklayayım: Hangi dosyaların değiştirildiğini ve hangilerinin yeni oluşturulduğunu görmek için iki dokuwiki sürümünü karşılaştırmak istiyoruz.

Biz wget ile katran getirme ve dizinleri onları ayıklamak old/ve new/:

wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29d.tgz
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29.tgz
mkdir old && tar xzf dokuwiki-2014-09-29.tgz -C old --strip-components=1
mkdir new && tar xzf dokuwiki-2014-09-29d.tgz -C new --strip-components=1

Rsync'i tek bir şekilde çalıştırmak, rsync ve diff'in karşılaştırması burada gösterildiği gibi yeni oluşturulan dosyaları kaçırabilir:

rsync -rcn --out-format="%n" old/ new/

aşağıdaki çıktıyı verir:

VERSION
doku.php
conf/mime.conf
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

Rsync'i yalnızca bir yönde çalıştırmak yeni oluşturulan dosyaları özlüyor ve diğer yoldan silinen dosyaları özleyecek, diff'in çıktısını karşılaştıracak:

diff -qr old/ new/

aşağıdaki çıktıyı verir:

Files old/VERSION and new/VERSION differ
Files old/conf/mime.conf and new/conf/mime.conf differ
Only in new/data/pages: playground
Files old/doku.php and new/doku.php differ
Files old/inc/auth.php and new/inc/auth.php differ
Files old/inc/lang/no/lang.php and new/inc/lang/no/lang.php differ
Files old/lib/plugins/acl/remote.php and new/lib/plugins/acl/remote.php differ
Files old/lib/plugins/authplain/auth.php and new/lib/plugins/authplain/auth.php differ
Files old/lib/plugins/usermanager/admin.php and new/lib/plugins/usermanager/admin.php differ

Rsync'in her iki şekilde çalıştırılması ve yinelenenleri kaldırmak için çıktıyı sıralamak, dizinin data/pages/playground/ve dosyanın data/pages/playground/playground.txtbaşlangıçta kaçırıldığını gösterir:

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

aşağıdaki çıktıyı verir:

VERSION
conf/mime.conf
data/pages/playground/
data/pages/playground/playground.txt
doku.php
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

rsync şu argümanlarla çalıştırılır:

  • -r "dizinleri tekrarlamak",
  • -c aynı boyuttaki dosyaları karşılaştırmak ve yalnızca "mod-time & size değil checksum'a göre atla",
  • -n "değişiklik yapılmadan deneme sürümü çalıştırması" ve
  • --out-format="%n" yalnızca dosya adı için "% n" olan "belirtilen FORMAT kullanarak güncellemeler çıktısını alma"

Her rsynciki yönde çıktı (dosya listesi) kullanılarak birleştirilir ve sıralanır sortve bu sıralı liste daha sonra tüm kopyalar kaldırılarak yoğunlaştırılır.uniq


diff new/ old/Hangi dizinlerin silindiğini görmek için geriye doğru ( ) koşamaz mıydınız?
Jacques

diff -qr new/ old/Yukarıdaki örnekte dokuwiki tars ile çalışan diff -qr old/ new/- yani dizinin yeni / eksik olduğunu ancak içindeki dosyaların olmadığını
görüyorsunuz

-4
rsync -rvc --delete --size-only --dry-run source dir target dir
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.