কেবলমাত্র ফাইলের নামের আউটপুট থেকে পৃথক


244

আমি লিনাক্স কমান্ড যে recursively দুই ডিরেক্টরি এবং আউটপুট তুলনা করবে চালানোর জন্য অপেক্ষায় থাকবো শুধুমাত্র কি ভিন্ন ফাইল নাম থাকবে না। এটিতে এমন কোনও কিছু অন্তর্ভুক্ত রয়েছে যা একটি ডিরেক্টরিতে উপস্থিত থাকে অন্যটি বা তদ্বিপরীত নয় এবং পাঠ্য পার্থক্য।

উত্তর:


375

ডিফার ম্যান পৃষ্ঠা থেকে:

-q   ফাইলগুলি পৃথক কিনা তা কেবল রিপোর্ট করুন, পার্থক্যের বিশদ নয়।
-r   ডিরেক্টরিগুলির সাথে তুলনা করার সময়, খুঁজে পাওয়া কোনও সাব-ডিরেক্টরিকে পুনরাবৃত্তভাবে তুলনা করুন।

উদাহরণ কমান্ড:

diff -qr dir1 dir2

উদাহরণ আউটপুট (স্থানীয় উপর নির্ভর করে):

$ ls dir1 dir2
dir1:
same-file  different  only-1

dir2:
same-file  different  only-2
$ diff -qr dir1 dir2
Files dir1/different and dir2/different differ
Only in dir1: only-1
Only in dir2: only-2

ধন্যবাদ - diffসেন্টোস 7 -এর ম্যান পেজটি -q"ফাইলগুলির মধ্যে কেবল তখনই প্রতিবেদন" হিসাবে বর্ণনা করে , যা আপনি লিখেছেন তার চেয়ে কম স্পষ্ট।
চ্যাপ্টু

2
এটি ফাইলগুলির আসল সামগ্রীর সাথে তুলনা করে যা প্রায়শই যা চায় তাই হয়, তবে, আরএসসিএনসি উত্তরটি কেবল ফাইলের নাম এবং আকারগুলি দেখার জন্য বিকল্প দেয় এবং সামগ্রীটি নয়; যে কখনও কখনও কাম্য হয়।
স্টিভ

ম্যাকোস-এও কাজ করে।
মারিয়াস সৌটিয়ার

এছাড়াও -x PATTERNনির্দিষ্ট সাব-ডাইরেক্টরি বাদ দিতে কমান্ড অন্তর্ভুক্ত করতে পারেন । উদাহরণস্বরূপ, diff -qr repo1 repo2 -x ".git" দুটি ডিরেক্টরি তুলনা করে তবে সেগুলিতে ".git" দিয়ে ফাইলের পথ বাদ দেবে।
ভিআইএফআই

27

আপনি rsync ব্যবহার করতে পারেন

rsync -rv --size-only --dry-run /my/source/ /my/dest/ > diff.out

6
--size-onlyঅভিন্ন আকারের ফাইলগুলি, তবে বিভিন্ন সামগ্রীর জন্য মিস করবে, যেমন পুরানো / সংস্করণ t txt "29a" new / version.txt "29b" । পরিবর্তে ব্যবহার করুন: rsync -ric --dry-run old/ new/যেখানে "-i" যুক্তি সরাসরি ফাইল তালিকা পেতে অনুমতি দেয়rsync -ric --dry-run old/ new/ | cut -d" " -f 2
iolsmit

6
এটি দুর্দান্ত যদি আপনি কেবলমাত্র অনুপস্থিত ফাইলগুলি (বিশেষত নেটওয়ার্ক শেয়ার জুড়ে) সন্ধান করছেন, কারণ এটি সামগ্রীর সাথে তুলনা করে না। এটি আমাকে কয়েকটি এনএএস-এ স্থানান্তরিত করতে গিয়ে ব্যর্থ হওয়া কয়েকটি ফাইল খুঁজে পেতে সহায়তা করেছে।
জোর

4
Rsync কমান্ড লাইনে নির্দিষ্ট পাথগুলির জন্য অনুসরণকারী স্ল্যাশ অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন। তাদের ছাড়াও, এটি সঠিকভাবে কাজ করবে না এবং আরএসসিএনসি সম্ভবত সমস্ত ফাইলের নাম গণনা করবে!
ভ্লাদিমির পানতেলিভ

2
বিষয়বস্তু যাচাই না করার বিষয়ে মন্তব্য সম্পর্কে। কমপক্ষে প্রথম পাস হিসাবে এটি কখনও কখনও কাম্য।
স্টিভ

13

আপনি যদি কেবল একটি ডিরেক্টরিতে থাকা ফাইলের একটি তালিকা পেতে চান তবে তাদের সাব ডিরেক্টরিগুলি এবং কেবল তাদের ফাইলের নাম নয়:

diff -q /dir1 /dir2 | grep /dir1 | grep -E "^Only in*" | sed -n 's/[^:]*: //p'

আপনি যদি পুরো ফাইলগুলির সাথে পৃথক সমস্ত ফাইল এবং ডিরেক্টরিগুলি পুনরাবৃত্তভাবে তালিকাবদ্ধ করতে চান:

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}'

এইভাবে আপনি সমস্ত ফাইলে বিভিন্ন কমান্ড প্রয়োগ করতে পারেন।

উদাহরণস্বরূপ, আমি dir1 তে থাকা সমস্ত ফাইল এবং ডিরেক্টরিগুলি সরিয়ে ফেলতে পারতাম তবে dir2 তে না:

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}' xargs -I {} rm -r {}

9

আমার লিনাক্স সিস্টেমে কেবল ফাইলের নাম পেতে

diff -q /dir1 /dir2|cut -f2 -d' '

7
আমি আমার লিনাক্স সিস্টেমে ফাঁকা ফাইল ফাইল রাখি না। ;)
জেরার্ড ২

6
আমি এর অর্থ আপনার কাছে বোঝাতে চাইছি না ... ;- পি ঠিক যেমন কারো জন্য ইঙ্গিত হিসাবে ...
মিচুয়েলনিক

আমার জন্য কাজ করে না। আমার ডিরেক্টরি কাঠামো নীচের মতaudit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
অ্যালেক্স রাজ কালীমূর্তি

diff -qrN /dir1 /dir2 | cut -f2 -d' 'আমার জন্য কাজ করে!
ফ্রান্সেস্কো

9

চলমান পদ্ধতির diff -qr old/ new/একটি বড় অসুবিধা রয়েছে: এটি সদ্য নির্মিত ডিরেক্টরিগুলিতে ফাইলগুলি মিস করতে পারে। উদাহরণস্বরূপ, ফাইলটি নীচের উদাহরণের মধ্যে ডিরেক্টরিটি যেখানে রয়েছে তার data/pages/playground/playground.txtআউটপুটটিতে নেই ( দ্রুত তুলনা করার জন্য আপনার ব্রাউজারে playground.txt অনুসন্ধান করুন)। আমি ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জে নিম্নলিখিত সমাধান পোস্ট করেছিdiff -qr old/ new/data/pages/playground/ , তবে আমি এটি এখানে অনুলিপি করব:

প্রোগ্রামযুক্তভাবে নতুন বা সংশোধিত ফাইলগুলির একটি তালিকা তৈরি করার জন্য আমি আসার সেরা সমাধানটি হ'ল আরএসইএনসি , সাজানো এবং ইউনিক ব্যবহার :

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

এই উদাহরণটি দিয়ে আমাকে ব্যাখ্যা করতে দাও: কোন ফাইলগুলি পরিবর্তন করা হয়েছিল এবং কোনটি নতুন তৈরি হয়েছিল তা দেখতে আমরা দুটি ডকউইকি প্রকাশের সাথে তুলনা করতে চাই।

আমরা উইজেট সহ টারগুলি আনা এবং সেগুলি ডিরেক্টরিগুলিতে বের করি old/এবং new/:

wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29d.tgz
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29.tgz
mkdir old && tar xzf dokuwiki-2014-09-29.tgz -C old --strip-components=1
mkdir new && tar xzf dokuwiki-2014-09-29d.tgz -C new --strip-components=1

আরএসসিএনকে একপথে চালানো এখানে নতুন তৈরি ফাইলগুলি আরএসইএনসি এবং ডিফের শোগুলির তুলনা হিসাবে মিস করতে পারে:

rsync -rcn --out-format="%n" old/ new/

নিম্নলিখিত আউটপুট ফলন:

VERSION
doku.php
conf/mime.conf
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

কেবলমাত্র এক দিকে চালনা করা সদ্য তৈরি হওয়া ফাইলগুলি মিস করে এবং অন্যভাবে মুছে ফেলা ফাইলগুলি মিস করবে, ভিন্নতার আউটপুট তুলনা করবে:

diff -qr old/ new/

নিম্নলিখিত আউটপুট ফলন:

Files old/VERSION and new/VERSION differ
Files old/conf/mime.conf and new/conf/mime.conf differ
Only in new/data/pages: playground
Files old/doku.php and new/doku.php differ
Files old/inc/auth.php and new/inc/auth.php differ
Files old/inc/lang/no/lang.php and new/inc/lang/no/lang.php differ
Files old/lib/plugins/acl/remote.php and new/lib/plugins/acl/remote.php differ
Files old/lib/plugins/authplain/auth.php and new/lib/plugins/authplain/auth.php differ
Files old/lib/plugins/usermanager/admin.php and new/lib/plugins/usermanager/admin.php differ

উভয় উপায়ে আরএসসিএন চালানো এবং ডুপ্লিকেট অপসারণের জন্য আউটপুটকে বাছাই করলে জানা যায় যে ডিরেক্টরি data/pages/playground/এবং ফাইলটি data/pages/playground/playground.txtপ্রাথমিকভাবে মিস হয়েছিল:

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

নিম্নলিখিত আউটপুট ফলন:

VERSION
conf/mime.conf
data/pages/playground/
data/pages/playground/playground.txt
doku.php
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

rsync এই তর্ক যুক্তি দিয়ে চালিত হয়:

  • -r "ডিরেক্টরিতে পুনরাবৃত্তি" করতে,
  • -c অভিন্ন আকারের ফাইলগুলি তুলনা করতে এবং কেবল "চেকসামের উপর ভিত্তি করে এড়িয়ে যান, মোড-টাইম এবং আকার নয়",
  • -n "কোনও পরিবর্তন ছাড়াই একটি ট্রায়াল রান সঞ্চালন" করতে এবং,
  • --out-format="%n" "নির্দিষ্ট ফরমেট ব্যবহার করে আউটপুট আপডেট করতে", যা কেবলমাত্র ফাইলের নামের জন্য এখানে "% n"

rsyncউভয় দিকের আউটপুট (ফাইলগুলির তালিকা) ব্যবহার করে একত্রিত করে বাছাই করা হয় sortএবং এই সাজানো তালিকাটি এর সাথে সমস্ত নকলকে সরিয়ে কনডেন্স করা হয়uniq


diff new/ old/কোন ডিরেক্টরি মুছে ফেলা হয়েছে তা দেখার জন্য আপনি কেবল এটি পিছন দিকে চালাতে পারবেন না ?
জ্যাকস

চলমান diff -qr new/ old/dokuwiki tars সঙ্গে উপরোক্ত উদাহরণে হিসাবে একই আউটপুট উত্পাদন করে diff -qr old/ new/- অর্থাৎ আপনি দেখতে ডিরেক্টরিটি এতে নতুন / অনুপস্থিত কিন্তু ফাইল হয়
iolsmit

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