GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa membuat 'diff -X' mengabaikan jalur tertentu dan bukan nama file?

Daftar direktori harus berfungsi; misalnya, inilah yang saya gunakan dalam skrip (dengan asumsi gnu diff),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... yang mengabaikan konten .svn dan .git dirs, tetapi juga file individual bernama *.zip /*.gz /dll.

Edit: Untuk memfilter jalur dalam bentuk dir_a/file1 tapi masih diff file dengan nama dasar yang sama, seperti dir_b/file1 atau dir_a/b/file1 , lalu daftar file ke diff harus dibuat (misalnya, menggunakan find ), dan file yang akan dibandingkan berasal dari jalur ini; mis., diberikan

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

Anda membuat daftar file untuk dibandingkan, tidak termasuk misalnya */a/2.txt tetapi masih membandingkan file lain bernama 2.txt . Cukup "temukan" semua file kecuali ONE/a/2.txt (regexp juga dapat digunakan di sini, seperti .*/a/2.txt )

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

yang pada dasarnya mengabaikan ONE/a/2.txt (dan TWO/a/2.txt ), tetapi tetap membandingkan file lain bernama 2.txt :

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

Edit: Atau, lebih seru dengan find (kesenangan tambahan tersisa sebagai latihan untuk pembaca), pilih file atau direktori untuk dikecualikan lalu diff yang lainnya:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

Contoh di atas mengecualikan file tertentu "{top}/a/2.txt", direktori apa pun bernama "b", dan yang lainnya adalah diff'd. (Alih-alih "-name b " Anda juga bisa menggunakan "-regex '.*/b' " - perhatikan, tidak ada tanda "/".)


Saya memiliki masalah yang sama jadi saya membuat tambalan ke diff . Tambalan belum diterima, tetapi Anda dapat membuat versi diff Anda sendiri dengan tambalan atau instal di Arch Linux dengan paket AUR.

Ini adalah diff tambalan.


Untuk mengecualikan direktori directory/sub-directory , saya menggunakan

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Namun, meskipun seharusnya berfungsi untuk satu pengecualian, seharusnya tidak mungkin untuk daftar pengabaian yang panjang seperti yang Anda miliki.


Linux
  1. Bagaimana saya bisa memeriksa file yang ada dan menjalankan perintah jika tidak?

  2. Bagaimana saya bisa menghapus baris baru jika itu adalah karakter terakhir dalam file?

  3. Cara menyentuh file dan mkdir jika diperlukan dalam satu baris

  1. Bagaimana saya bisa menyimpan file dan menghapus baris yang dikomentari?

  2. Bagaimana cara membuat file TIDAK dapat dimodifikasi?

  3. Mengapa crontab saya tidak berfungsi, dan bagaimana cara mengatasinya?

  1. Cara Membuat File dan Direktori Tidak Dapat Dihapus, Bahkan Dengan Root di Linux

  2. Bagaimana Agar Ibus Tidak Abaikan ~/.xcompose?

  3. Bagaimana cara membuat file jarang?