কেবলমাত্র নির্দিষ্ট ধরণের ফাইলের জন্য ডিরেক্টরিকে কীভাবে পৃথক করবেন?


88

আমি ডিফ কমান্ড সম্পর্কে আমার একটি প্রশ্ন আছে যদি আমি একটি পুনরাবৃত্ত ডিরেক্টরিটি পৃথক চাই তবে কেবল একটি নির্দিষ্ট ফাইল টাইপের জন্য, কীভাবে এটি করা যায়?

আমি বাদ দেওয়া বিকল্পটি ব্যবহার করার চেষ্টা করেছি তবে কেবলমাত্র একটি প্যাটার্ন ব্যবহার করতে পারি:

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

কমান্ড আমি শুধু অগ্রাহ্য করতে XML ফাইল ধরনের সঙ্গে, যদিও সেখানে ফোল্ডারের ইমেজ প্রকার (ফাইল হয় png, gif, jpg), txt, php, ইত্যাদি

কেবলমাত্র কিছু নির্দিষ্ট ফাইলের মধ্যে কীভাবে পার্থক্য করা যায়।



সুতরাং আপনি কি নির্দিষ্ট ধরণের ফাইলগুলি পৃথক করার চেষ্টা করছেন বা সেই ফাইলগুলি পৃথক করে বাদ দিতে চান? প্রশ্ন বর্ণনার সাথে সম্পর্কিত নয় ..
Def

উত্তর:


98

আপনি -xএকাধিকবার নির্দিষ্ট করতে পারেন ।

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

তুলনায় ডিরেক্টরি বিভাগ থেকে info diff(আমার সিস্টেমে, আমাকে করতে হবে info -f /usr/share/info/diff.info.gz):

ডিরেক্টরিগুলির সাথে তুলনা করার সময় কিছু ফাইল উপেক্ষা করার জন্য, '-x PATTERN' বা '--excolve = PATTERN' বিকল্পটি ব্যবহার করুন। এই বিকল্পটি এমন কোনও ফাইল বা উপ-ডিরেক্টরিকে উপেক্ষা করে যার বেস নামগুলি শেল প্যাটার্ন PATTERN এর সাথে মেলে। শেলের বিপরীতে, কোনও ফাইলের নামের গোড়ায় শুরু হওয়া সময়কাল কোনও প্যাটার্নের শুরুতে একটি ওয়াইল্ডকার্ডের সাথে মেলে। আপনার PATTERN কে উদ্ধৃতিতে সংযুক্ত করা উচিত যাতে শেলটি প্রসারিত না হয়। উদাহরণস্বরূপ, বিকল্প -x '*। [Ao]' এমন কোনও ফাইলকে উপেক্ষা করে যার নাম '.a' বা '.o' দিয়ে শেষ হয়।

আপনি যদি একাধিকবার নির্দিষ্ট করে থাকেন তবে এই বিকল্পটি জমে। উদাহরণস্বরূপ, -x 'আরসিএস' -x '* অপশনগুলি ব্যবহার করে v' এমন কোনও ফাইল বা উপ-ডিরেক্টরিকে উপেক্ষা করে যার মূল নামটি 'আরসিএস' বা ', ভি' দিয়ে শেষ হয়।


খনি (উবুন্টু 10.04) এর এই লাইনগুলি নেই। আমি চেষ্টা করেছি এবং এটি কার্যকর হয়নি। আমার ধারণা এটি একটি নতুন সংস্করণ।
alumi

22

ম্যান পৃষ্ঠা থেকে (একটি সংস্করণ) নেওয়া:

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

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

সুতরাং দেখে মনে হচ্ছে যে আপনি -xকেবল প্রতিবেদন হিসাবে একটি প্যাটার্ন গ্রহণ করেছেন তবে আপনি যদি কোনও ফাইলের মধ্যে বাদ দিতে চান এমন সমস্ত প্যাটার্নগুলি রাখেন (সম্ভবত প্রতি লাইনে একটি) আপনি দ্বিতীয় পতাকাটি এর মতো ব্যবহার করতে পারেন:

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

যেখানে বাদ দিন.প্যাটস হ'ল:

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

4
নীচের কমান্ড লাইনের সাথে <my-xt> এক্সটেনশন বাদে আপনি আপনার ফোল্ডারের মধ্যে সমস্ত ফাইল এক্সটেনশানগুলি খুঁজে পেতে পারেন:find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
জন

আমি আশা করি আমি জনের মন্তব্যটি আগে লক্ষ্য করেছি, কিন্তু ম্যাকো / ব্যাশে আমি বহিরাগত প্যাটার্ন সহ বর্জনকারী ফাইল তৈরির অনুরূপ সমাধানে এসেছি: 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আমি বিশ্বাস করতে চাই যে এটি লিনাক্সেও সম্ভবত সহায়তা করে। (এই উদাহরণে একটি অবিবাহিত -name "*.[ch]"ঠিক আছে, তবে এটি খুব উদাহরণস্বরূপ নয়)


7

পরিপূরক অভাব - অন্তর্ভুক্ত ...।

আমরা একটি কাজ করতে পারি, সমস্ত ফাইল সহ একটি ফাইল বাদ দিতে পারি তবে আমরা যা অন্তর্ভুক্ত করতে চাই তা করতে পারি। সুতরাং আমরা এমন 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 

সুপার দরকারী ওয়ান-লাইনার, থেক্স ম্যাক ওএসএক্সfind PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
গ্রেপ

3

আমি নিম্নলিখিত কমান্ডটি ব্যবহার করে এবং এর *.tmplমধ্যে সমস্ত ফাইলের পার্থক্য খুঁজে পেতে পারি । আমার ক্ষেত্রে এটি কোনও মিথ্যা ইতিবাচক ফল দেয়নি, তবে এটি আপনার ডিআইআরএসের সামগ্রীর উপর নির্ভর করে আপনার পক্ষে হতে পারে।DIR1DIR2

diff --brief DIR1 DIR2 | grep tmpl


2

আপনি যদি উত্সগুলি পৃথক করতে চান এবং এটিকে সহজ রাখতে চান:

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

আপনি যদি কেবলমাত্র কোনও একটি পাথের মধ্যে থাকা ফাইলগুলি পেতে চান তবে সর্বশেষ গ্রেপটি সরান।


আমি সরলতা :-) জার্মান পরিবর্তন grep "^Files"করতেgrep "^Dateien"
এরিক Kuester

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

পরিপূরক - অন্তর্ভুক্তির অভাব যেমন সংশ্লেষিত হিউরিস্টিক নিদর্শনগুলি ব্যবহার করে তা প্রয়োজনীয় করে তোলে

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

(বেশিরভাগ) জাভা ফাইলগুলি সন্ধান করতে!


0

যদিও এটি diffঅন্যান্য ফাইলগুলির প্রকৃত ঘটনা এড়াতে পারে না , যদি আপনার লক্ষ্যটি কোনও প্যাচ ফাইল তৈরি করতে হয় বা অনুরূপ হয় তবে আপনি প্যাকেজটি filterdiffথেকে ব্যবহার করতে পারেন patchutils, যেমন কেবলমাত্র আপনার .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.