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.