特定のタイプのファイルのみのディレクトリをどのように比較しますか?


88

再帰的なディレクトリdiffが必要なのに、特定のファイルタイプのみが必要な場合、diffコマンドについて質問があります。どうすればよいですか?

除外オプションを使用しようとしましたが、使用できるパターンは1つだけです。

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml

コマンドを使用して、私は、フォルダの画像の種類のファイルが(あるにもかかわらず、xmlファイルの種類を除外することができpnggifjpg、) txtphpなど、

特定のファイルタイプのみを比較する方法。



それで、特定のタイプのファイルを差分しようとしていますか、それともそれらのファイルを差分から除外しようとしていますか?質問は説明とは相関していません
def

回答:


97

-x複数回指定できます。

diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2

info diff(私のシステムでは、私がしなければならないinfo -f /usr/share/info/diff.info.gz)のディレクトリの比較セクションから:

ディレクトリの比較中に一部のファイルを無視するには、「-xPATTERN」または「--exclude = PATTERN」オプションを使用します。このオプションは、ベース名がシェルパターンPATTERNと一致するファイルまたはサブディレクトリを無視します。シェルとは異なり、ファイル名のベースの先頭にあるピリオドは、パターンの先頭にあるワイルドカードと一致します。シェルがPATTERNを展開しないように、PATTERNを引用符で囲む必要があります。たとえば、オプション-x '*。[ao]'は、名前が '.a'または '.o'で終わるファイルをすべて無視します。

このオプションは、複数回指定すると累積されます。たとえば、オプション-x'RCS '-x' *、v 'を使用すると、ベース名が' RCS 'であるか、'、v 'で終わるファイルまたはサブディレクトリは無視されます。


鉱山(ubuntu 10.04)にはこれらの行がありません。私も試しましたが、うまくいきませんでした。これは新しいバージョンだと思います。
alumi 2013

22

manページ(のバージョン)から取得:

-x PAT  --exclude=PAT
  Exclude files that match PAT.

-X FILE    --exclude-from=FILE
  Exclude files that match any pattern in FILE.

したがって、-xレポート時に1つのパターンのみを受け入れるように見えますが、除外するすべてのパターンをファイルに入れる場合(おそらく1行に1つ)、次のように2番目のフラグを使用できます。

$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats

ここで、exclude.patsは次のとおりです。

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif

4
あなたは、<私の-EXT>以外のフォルダ内のすべてのファイル拡張子を見つけることができる次のコマンドラインを持つ拡張子:find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
ジョン・

ジョンのコメントに以前気づいたらいいのにと思いますが、macOs / bashで同様の解決策にたどり着き、いくつかのパターンを保持する除外ファイルを作成しましたfind . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILE。それが役立つと信じたいのですが、おそらくLinuxでもそうです。(この例では、シングル-name "*.[ch]"は問題ありませんが、あまり説明的ではありません)
2017年

16

findと-execを使用してdiffを呼び出すこともできます。

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;

7

補完的な--include ...の欠如。

1つの回避策を実行できます。すべてのファイルを含む除外ファイルですが、必要なものを含めます。したがってfile1、含める拡張子がないすべてのファイルを検索して作成しsed、ファイル名をキャッチして、次のようにします。

diff --exclude-from=file1  PATH1/ PATH2/

例えば:

find  PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 
diff PATH1/ PATH2/ -rq -X file1 

超便利なワンライナー、THX。Mac OSXでは、grepはわずかに異なり、次のようになります find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
mmacvicar 2016年

3

次のコマンドを使用して、との*.tmpl間のすべてのファイルの差分を見つけました。私の場合、これは誤検知を引き起こしませんでしたが、DIRSの内容によっては、誤検知が発生する可能性があります。DIR1DIR2

diff --brief DIR1 DIR2 | grep tmpl


2

便利な場合は、以下を使用できますMakefile。実行するだけ:「パッチを作成」

#Makefile for patches

#Exlude following file endings
SUFFIX += o
SUFFIX += so
SUFFIX += exe
SUFFIX += pdf
SUFFIX += swp

#Exlude following folders
FOLDER += bin
FOLDER += lib
FOLDER += Image
FOLDER += models

OPTIONS = Naur

patch: 
    rm test.patch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
        org/ new/ > test.patch  

unpatch: 
    rm test.unpatch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
    new/ org/ > test.unpatch

1

補完的な--includeがないため、次のような複雑なヒューリスティックパターンを使用する必要があります。

*.[A-Zb-ik-uw-z]*

(ほとんど)Javaファイルを見つけるために!


1

ソースを変えてシンプルにしたい場合:

diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"

パスの1つにのみ存在するファイルを取得する場合は、最後のgrepを削除します。


0

diff他のファイルの実際を回避することはできませんが、パッチファイルなどを作成することが目標である場合はfilterdiffpatchutilsパッケージから使用できます。たとえば、.py変更のみにパッチを適用できます。

diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.