Bagaimana cara membuat daftar file yang dimodifikasi secara terprogram menggunakan alat baris perintah linux? Saya tidak tertarik dengan perbedaan pada file tertentu (delta, patch). Saya hanya ingin memiliki daftar file baru atau yang dimodifikasi dibandingkan dengan rilis produk sebelumnya. Sehingga saya dapat menerbitkan pembaruan produk baru.
pembaruan: diff -qr
tidak menghasilkan keluaran yang sangat nyaman. Output diff -qr
juga perlu diproses. Apakah ada cara yang lebih baik?
linux
bash
command-line
diff
Alpha Sisyphus
sumber
sumber
Jawaban:
Saya punya pendekatan sederhana untuk ini: Gunakan mode rsync-preview:
File yang ditampilkan sebagai "akan dihapus" oleh perintah itu akan menjadi file "baru". Yang lain yang akan ditransfer telah berubah dalam beberapa cara. Lihat halaman man-rsync untuk detail lebih lanjut.
sumber
Anda dapat menggunakan diff toool: lihat opsi -q dan -r
Contoh:
sumber
Only in
yang muncul bahkan jika direktori adalah salinan yang ideal. Saya diperlukan untuk membandingkan perubahan terhadap revisi lama, dan akhirnya mengunduh seluruh revisi ke direktori terpisah, dan menggunakan alat SVN standar untuk membandingkan. Itu sepertinya satu-satunya cara untuk pergi ...The
diffutils
paket termasuklsdiff
alat. Cukup berikan outputdiff -u
ke ke lsdiff:sumber
patchutils
paket untuk saya (CentOS 5.x).Saya hanya akan menyentuh file pada saat setiap pembaruan, dan kemudian Anda dapat menemukan file yang dimodifikasi sejak saat itu dengan
find /tree/location -newer /last/update/file -print
sumber
Untuk hanya mengambil nama file yang diubah, saya menggunakan perintah ini:
Jika perlu mengecualikan beberapa file sebagai file objek atau file perpustakaan, Anda dapat menggunakan:
sumber
Untuk membuat daftar file baru atau yang dimodifikasi secara terprogram solusi terbaik yang dapat saya buat adalah menggunakan rsync , sortir , dan uniq :
Mari saya jelaskan 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 mengurutkan output untuk menghapus duplikat mengungkapkan bahwa direktori
data/pages/playground/
dan filedata/pages/playground/playground.txt
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
Anda harus mendapatkan hasil yang diinginkan menggunakan:
sumber
Ini mungkin melakukan trik:
sumber
Biasanya Anda meletakkan file ke dalam semacam sistem kontrol versi seperti SubVersion atau git, karena mereka dapat melakukan ini untuk Anda di luar kotak.
Tapi Anda bisa melakukan skrip cepat dengan for loop di dir1 dan kemudian membandingkan setiap file dengan yang ada di dir2. Untuk loop dapat melihat kode keluar dari diff untuk mengetahui apakah file berbeda.
Mungkin kira-kira seperti ini:
Catatan: Script tidak diuji, jadi contoh di atas adalah "bash terinspirasi pseudocode" ...
Mari kita lakukan lagi tetapi dengan git
Buat beberapa file contoh untuk dimainkan
Kemudian masukkan dir dan impor dir1
Keluar dan modifikasi dir1 (jadi itu dir2 Anda)
Lalu masuk ke git dir dan impor dir baru
Sekarang tanyakan git apa yang telah berubah (dengan perintah status)
Outputnya adalah daftar dengan perubahan, yang terlihat seperti ini:
sumber
Mungkin Anda akan lebih bahagia dengan sesuatu yang berbeda. Coba
git
.Lakukan ini sebagai contoh:
git
akan melacak file Anda untuk Anda. Perintahgit status
akan menunjukkan kepada Anda semua file yang telah dimodifikasi sejak komit terakhir.sumber
Ini mirip dengan rsync: menunjukkan kapan file yang lebih baru pada tujuan ditimpa (ditanyakan kemudian, meskipun bukan duplikat).
Seperti ditunjukkan dalam pertanyaan, "diff -q -r" mungkin memerlukan beberapa pemrosesan agar bermanfaat. Pertanyaannya tidak menentukan bentuk output; jawabannya memberikan berbagai jenis laporan.
rsync
adalah alat yang berguna untuk tujuan ini karena jauh lebih cepat daripadadiff
. Namun solusi yang disarankan oleh @nils jauh lebih verbose (dan daftar lebih banyak file) daripada perbedaan aktual antara pohon direktori lama / baru. Misalnya, membandingkannya dengan skrip yang saya tulis untuk jawaban itu, dan berjalan pada data yang sama,Untuk membuat
diff
akun baru dengan benar untuk file - file baru , Anda juga perlu-N
opsi (yang saya tidak melihat di salah satu jawaban yang disarankan). Namun, karena jauh lebih lambat (urutan besarnya) daripadarsync
, meningkatkan output yang terakhir tampaknya cara untuk pergi.Bacaan lebih lanjut
sumber
Saya selalu menyukai sha1sum (atau bahkan md5sum; dalam konteks ini cukup aman).
Terkadang - seperti jika Anda memiliki terlalu banyak file yang diubah namanya atau dipindahkan - mengurutkan pada bidang pertama dan kemudian melakukan diff bisa membantu, tetapi sebagian besar waktu ini cukup baik.
Perhatikan bahwa, dibandingkan dengan beberapa metode lain, ini memiliki keuntungan bahwa Anda tidak perlu menyimpan salinan file "sebelum"; hanya file output md5sum.
sumber