ডিফ -আর শুধুমাত্র নির্দিষ্ট ফাইলের জন্য


12

আমি কি দুটি উপায়ের একটি পুনরাবৃত্ত পার্থক্য সম্পাদন করতে পারি তবে কেবল একটি ফাইল ফাইল বা টাইপ প্রিকিকেটের সাথে মেলে এমন ফাইলগুলি (স্ব স্ব স্থানে) তুলনা করতে পারি?

যেমন আমি কিছু করতে চাই

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

... বা আরও ভাল:

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

স্পষ্টতই এটি ব্যবহার diffকরা বাধ্যতামূলক নয় কারণ আমি মনে করি যে আমি একটি উদ্দীপনাটি আবিষ্কার করেছি findএবং এটি কৌশলটিও করতে -exec diffপারে (পরবর্তী ক্ষেত্রে কীভাবে পরিপূরক ফাইলপথ তৈরি করতে হয় তা আমি জানি না)।


3
কোনও প্যাটার্নের সাথে মেলে এমন ফাইলগুলি বাদ দেওয়ার বিকল্প রয়েছে, আমি কেবল প্যাটার্নের সাথে মেলে এমন ফাইলগুলি অন্তর্ভুক্ত করার বিকল্প দেখতে পাচ্ছি না।
বর্মার

1
ডিরেক্টরিগুলির সাথে তুলনা করার জন্য নির্দিষ্ট সমস্ত বিকল্প gnu.org/software/diffutils/manual/html_node/…
বারমার

1
এই লিঙ্কটি দেখুন এবং সেরজিও উত্তর দেখুন।
ইয়াহুদাহস

উত্তর:


1

হোস্টনেম differ-r

এই শেলসক্রিপ্টটি দুটি ডিরেক্টরিতে পুনরাবৃত্তিমূলক পারফরম্যান্স সম্পাদন করতে পারে তবে একটি নির্দিষ্ট ফাইল নাম বা ফাইল টাইপ প্যাটার্নের সাথে মেলে এমন ফাইলগুলি কেবল (তাদের নিজ নিজ জায়গায়) তুলনা করতে পারে।

#!/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 {} +

ডেমো

নথি পত্র:

$ 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

ব্যবহার:

$ ./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"

চলমান differ-r:

সম্পাদিত diffকমান্ড লাইনগুলি সবুজ পাঠ্য এবং আউটপুট দিয়ে মুদ্রিত হয় যখন ডিফল্ট পাঠ্য (নিম্নলিখিত স্ক্রিনশটটিতে কালো রঙের সাদা) দিয়ে মুদ্রণ করা হয় না।

এখানে চিত্র বর্ণনা লিখুন

$ ./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 ফিল্টার সহ

পার্থক্য বর্ণনা করার জন্য যদি আপনার কোনও আউটপুট না পাওয়া দরকার থাকে তবে কেবলমাত্র কোন ফাইলগুলি পৃথক বা অনুপস্থিত তা জানেন (যাতে rsyncসেগুলি অনুলিপি করতে চান), আপনি নীচের কমান্ড লাইনটি ব্যবহার করতে পারেন।

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

ডেমো

$ 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)
olle@bionic64 /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)

আপনি যদি লাইন মন্তব্য না করে এবং ডিরেক্টরি ছাড়াই একটি পরিষ্কার আউটপুট চান তবে আপনি grepআউটপুটটি এর মতো করতে পারেন,

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

হোস্টনেম rsync-diff

এই ওয়ান-লাইনারটি শেলস্ক্রিপ্টের মূল কমান্ড তৈরি করা যেতে পারে 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)$'

0

যেহেতু আপনি উল্লেখ করেছেন "স্পষ্টতই এটি ডিফ ব্যবহার করা বাধ্যতামূলক নয়",

কোন ধরণের ফাইল উপেক্ষা করা উচিত তার জন্য আপনার পক্ষে সহজেই কনফিগারযোগ্য মেল্ডের কাজটি করা উচিত :

এখানে চিত্র বর্ণনা লিখুন

তদ্ব্যতীত অন্য বিকল্পটি হ'ল একটি সাধারণ স্ক্রিপ্ট লিখতে হবে যা একটি সাদা তালিকা থেকে একটি কালো তালিকায় স্থানান্তরিত হবে এবং তারপরে কালো তালিকাটি --excludeবিকল্পের সাথে পৃথক হয়ে যাবে ।


'কমান্ড-লাইন' যুক্ত করতে ট্যাগগুলি আপডেট করা হয়েছে
মারকাস জুনিয়াস ব্রুটাস

0

শেল সাপোর্টিং কমান্ড প্রতিস্থাপনের সাহায্যে আপনি নিম্নলিখিত ওয়ান-লাইনার ব্যবহার করতে পারেন (যেমন ইতিমধ্যে @ জ্যামিংথিবটস দ্বারা উল্লিখিত):

diff -r dir-a dir-b --exclude-from=<( \
find dir-a dir-b -type f -not \( -name '*.xml'  -or -name '*.java' \) \
| sed 's:^.*/\([^/]*\)$:\1:' \
)

এটি এর মতো কাজ করে: findস্বার্থযুক্ত নয় এমন ফাইলগুলির জন্য অনুসন্ধান করুন, sedবেসনামটি বের করুন ( basenameআপনার কাছে অনেকগুলি ফাইল থাকলে চলমান অত্যন্ত ধীর হয়) এবং এগুলি একটি অস্থায়ী ফাইলে রাখেন ; এরপরে ফাইলটি diffতুলনা (ডাবল বর্জন = অন্তর্ভুক্তি) থেকে বাদ দেওয়ার জন্য এটি বলার জন্য পাস করা হয় ।

আপনার যদি কমান্ড প্রতিস্থাপন না থাকে তবে sedআউটপুটটিকে কোনও ফাইলে রাখুন এবং স্পষ্টভাবে এটিতে দিন diff

উদাহরণে আমি কেবল এক্সএমএল এবং জাভা ফাইল অনুসন্ধান করেছি, ওআর দিয়ে পৃথক করে প্রয়োজনীয় হিসাবে তাদের পরিবর্তন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.