Saya mencari untuk menjalankan perintah Linux yang secara rekursif akan membandingkan dua direktori dan hanya menghasilkan nama file yang berbeda. Ini termasuk apa pun yang ada dalam satu direktori dan bukan yang lain atau sebaliknya, dan perbedaan teks.
linux
command-line
diff
barfoon
sumber
sumber
diff
halaman manual di CentOS 7 menggambarkan-q
sebagai "laporkan hanya ketika file berbeda", yang kurang jelas dari apa yang Anda tulis.-x PATTERN
dalam perintah untuk mengecualikan subdirektori tertentu. Sebagai contoh,diff -qr repo1 repo2 -x ".git"
akan membandingkan dua direktori tetapi akan mengecualikan jalur file dengan ".git" di dalamnya.Anda juga dapat menggunakan rsync
sumber
--size-only
akan kehilangan file dengan ukuran yang identik tetapi konten yang berbeda, mis. old / version.txt "29a" new / version.txt "29b" . Gunakan sebaliknya: dirsync -ric --dry-run old/ new/
mana argumen "-i" memungkinkan untuk mendapatkan daftar file secara langsung melaluirsync -ric --dry-run old/ new/ | cut -d" " -f 2
Jika Anda ingin mendapatkan daftar file yang hanya dalam satu direktori dan bukan sub direktori dan hanya nama file mereka:
Jika Anda ingin membuat daftar semua file dan direktori yang berbeda dengan path lengkapnya secara rekursif:
Dengan cara ini Anda dapat menerapkan perintah berbeda untuk semua file.
Misalnya saya bisa menghapus semua file dan direktori yang ada di dir1 tetapi tidak dir2:
sumber
Di sistem linux saya hanya mendapatkan nama file
sumber
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
bekerja dengan baik untuk saya!Pendekatan menjalankan
diff -qr old/ new/
memiliki satu kelemahan utama: mungkin kehilangan file di direktori yang baru dibuat. Misalnya dalam contoh di bawah filedata/pages/playground/playground.txt
tidak dalam outputdiff -qr old/ new/
sedangkan direktoridata/pages/playground/
(cari playground.txt di browser Anda untuk dengan cepat membandingkan). Saya juga memposting solusi berikut di Unix & Linux Stack Exchange , tetapi saya juga akan menyalinnya di sini:Untuk membuat daftar file baru atau yang dimodifikasi secara terprogram, solusi terbaik yang dapat saya gunakan adalah menggunakan rsync , sortir , dan uniq :
Izinkan saya menjelaskan dengan contoh ini: kami ingin membandingkan dua rilis dokuwiki untuk melihat file mana yang diubah dan mana yang baru dibuat.
Kami mengambil ter dengan wget dan mengekstraknya ke direktori
old/
dannew/
:Menjalankan rsync salah satu cara mungkin kehilangan file yang baru dibuat karena perbandingan rsync dan diff ditampilkan di sini:
menghasilkan output berikut:
Menjalankan rsync hanya dalam satu arah melewatkan file yang baru dibuat dan sebaliknya akan kehilangan file yang dihapus, bandingkan output dari diff:
menghasilkan output berikut:
Menjalankan rsync baik cara dan menyortir output untuk menghapus duplikat menunjukkan bahwa direktori
data/pages/playground/
dan filedata/pages/playground/playground.txt
pada awalnya tidak terjawab:menghasilkan output berikut:
rsync
Dijalankan dengan argumen tesis:-r
untuk "berulang ke direktori",-c
untuk juga membandingkan file dengan ukuran identik dan hanya "lewati berdasarkan checksum, bukan mod-time & size",-n
untuk "melakukan uji coba tanpa perubahan yang dibuat", dan--out-format="%n"
ke "keluaran pembaruan menggunakan FORMAT yang ditentukan", yaitu "% n" di sini hanya untuk nama fileOutput (daftar file) dari
rsync
kedua arah digabungkan dan diurutkan menggunakansort
, dan daftar yang diurutkan ini kemudian diringkas dengan menghapus semua duplikat denganuniq
sumber
diff new/ old/
) untuk melihat direktori mana yang dihapus?diff -qr new/ old/
pada contoh di atas dengan tars dokuwiki menghasilkan output yang sama dengandiff -qr old/ new/
- yaitu Anda melihat bahwa direktori baru / hilang tetapi bukan file di dalamnyasumber