GNU/Linux >> Belajar Linux >  >> Linux

Diff -r Hanya Untuk Jenis File Tertentu?

Apakah ada cara saya dapat melakukan perbedaan rekursif dari dua direktori tetapi hanya membandingkan (di tempat masing-masing) file yang cocok dengan nama file atau predikat tipe file tertentu?

Misalnya. Saya ingin melakukan sesuatu seperti

diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml

… atau bahkan lebih baik:

diff -r dir-a dir-b -filetype text

Jelas tidak wajib menggunakan diff seperti yang saya kira mantra dengan find dan -exec diff mungkin juga melakukan trik (saya hanya tidak tahu cara menghasilkan jalur file pelengkap dalam kasus terakhir).

Jawaban yang Diterima:

Shellscript differ-r

Shellscript ini dapat melakukan diff rekursif dari dua direktori tetapi hanya membandingkan (di tempat masing-masing) file yang cocok dengan nama file atau pola tipe file tertentu.

#!/bin/bash

greenvid="\0033[32m"
resetvid="\0033[0m"

if [ $# -ne 3 ]
then
 echo "Usage: compare files in two directories including subdirectories"
 echo "         $0 <source-dir> <target-dir> <pattern>"
 echo "Example: $0  subdir-1     subdir-2     \"*.txt\""
 exit
fi

cmd='for pathname do
        greenvid="\0033[32m"
        resetvid="\0033[0m"
        echo -e "${greenvid}diff \"$pathname\" \"${pathname/'\"$1\"'/'\"$2\"'}\"${resetvid}"
        diff "$pathname" "${pathname/'\"$1\"'/'\"$2\"'}"
    done'
#echo "$cmd"

find "$1" -type f -name "$3" -exec bash -c "$cmd" bash {} +

Demo

File:

$ find -type f
./1/ett.txt
./1/two.doc
./1/t r e.txt
./1/sub/only-one.doc
./1/sub/hello.doc
./1/sub/hejsan.doc
./differ-r2
./differ-r1
./differ-r
./2/ett.txt
./2/two.doc
./2/t r e.txt
./2/sub/hello.doc
./2/sub/hejsan.doc

Penggunaan:

$ ./differ-r
Usage: compare files in two directories including subdirectories
         ./differ-r <source-dir> <target-dir> <pattern>
Example: ./differ-r  subdir-1     subdir-2     "*.txt"

Menjalankan differ-r :

diff . yang dilakukan baris perintah dicetak dengan teks hijau dan hasilnya, bila tidak ada yang cocok dicetak dengan teks default (putih di atas hitam pada tangkapan layar berikut).

$ ./differ-r 1 2 "*.doc"
diff "1/two.doc" "2/two.doc"
diff "1/sub/only-one.doc" "2/sub/only-one.doc"
diff: 2/sub/only-one.doc: No such file or directory
diff "1/sub/hello.doc" "2/sub/hello.doc"
2d1
< world
diff "1/sub/hejsan.doc" "2/sub/hejsan.doc"

$ ./differ-r 1 2 "*.txt"
diff "1/ett.txt" "2/ett.txt"
2c2
< stabben
---
> farsan
diff "1/t r e.txt" "2/t r e.txt"
1c1
< t r e
---
> 3
$ 

$ ./differ-r 1 2 "*"
diff "1/ett.txt" "2/ett.txt"
2c2
< stabben
---
> farsan
diff "1/two.doc" "2/two.doc"
diff "1/t r e.txt" "2/t r e.txt"
1c1
< t r e
---
> 3
diff "1/sub/only-one.doc" "2/sub/only-one.doc"
diff: 2/sub/only-one.doc: No such file or directory
diff "1/sub/hello.doc" "2/sub/hello.doc"
2d1
< world
diff "1/sub/hejsan.doc" "2/sub/hejsan.doc"

$ ./differ-r 2 1 "*"
diff "2/ett.txt" "1/ett.txt"
2c2
< farsan
---
> stabben
diff "2/two.doc" "1/two.doc"
diff "2/t r e.txt" "1/t r e.txt"
1c1
< 3
---
> t r e
diff "2/sub/hello.doc" "1/sub/hello.doc"
1a2
> world
diff "2/sub/hejsan.doc" "1/sub/hejsan.doc"

rsync dengan filter

Jika Anda tidak perlu mendapatkan keluaran yang menjelaskan perbedaannya, ketahui saja file mana yang berbeda atau hilang (sehingga rsync ingin menyalinnya), Anda dapat menggunakan baris perintah berikut.

rsync --filter="+ <pattern>" --filter="+ */" --filter="- *"--filter="- */"  -avcn <source directory>/ <target directory>

Demo

$ rsync --filter="+ *.doc" --filter="+ */" --filter="- *"  -avcn 1/ 2
sending incremental file list
./
sub/
sub/hello.doc
sub/only-one.doc

sent 276 bytes  received 35 bytes  622.00 bytes/sec
total size is 40  speedup is 0.13 (DRY RUN)

sent 360 bytes  received 41 bytes  802.00 bytes/sec
total size is 61  speedup is 0.15 (DRY RUN)
[email protected] /media/multimed-2/test/test0/temp $ rsync --filter="+ *.txt" --filter="+ */" --filter="- *" -avcn 1/ 2
sending incremental file list
./
ett.txt
t r e.txt
sub/

sent 184 bytes  received 29 bytes  426.00 bytes/sec
total size is 21  speedup is 0.10 (DRY RUN)

Jika Anda menginginkan hasil yang bersih tanpa baris komentar dan tanpa direktori, Anda dapat grep outputnya seperti ini,

$ pattern="*.doc"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *"  -avcn 1/ 2 | grep "${pattern/\*/.\*}"
sub/hello.doc
sub/only-one.doc

Shellscript rsync-diff

One-liner ini dapat dibuat menjadi perintah inti dari shellscript rsync-diff .

#!/bin/bash

LANG=C

if [ $# -ne 3 ]
then
 echo "Usage: compare files in two directories including subdirectories"
 echo "         $0 <source-dir> <target-dir> <pattern>"
 echo "Example: $0  subdir-1     subdir-2     \"*.txt\""
 exit
fi

pattern="$3"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *" \
 -avcn "$1"/ "$2" | grep "${pattern//\*/.\*}" | grep -v \
  -e '/$' \
  -e '^sending incremental file list$' \
  -e '^sent.*received.*sec$' \
  -e '^total size is.*speedup.*(DRY RUN)$'

Linux
  1. Tabel Izin untuk Jenis Pengguna File/Direktori Dan Sistem File

  2. rsync hanya menyalin jenis file tertentu menggunakan opsi sertakan

  3. Bagaimana cara menemukan file yang hanya memiliki izin pemilik tertentu?

  1. sys/types.h:Tidak ada file atau direktori tersebut

  2. Diff/patch biner untuk file besar di linux?

  3. Jadikan file hanya dapat dibaca di Linux bahkan untuk root

  1. Bagaimana Cara Mengarahkan Hanya Stderr?

  2. Temukan Hanya String Tertentu (domain) Ekstrak File Lain?

  3. Rsync Dua Jenis File Dalam Satu Perintah?