লিনাক্স ডিফ সরঞ্জামসমূহ: পরিবর্তিত ফাইলগুলির তালিকা তৈরি করুন


14

আমি কিভাবে লিনাক্স কমান্ড লাইন সরঞ্জাম ব্যবহার করে প্রোগ্রামযুক্তভাবে পরিবর্তিত ফাইলগুলির একটি তালিকা তৈরি করব? আমি কোনও নির্দিষ্ট ফাইল (ব-দ্বীপ, প্যাচ) এর পার্থক্যে আগ্রহী নই। আমি কেবল পূর্ববর্তী পণ্য প্রকাশের সাথে তুলনা করে নতুন বা সংশোধিত ফাইলগুলির একটি তালিকা পেতে চাই। যাতে আমি একটি নতুন পণ্য আপডেট প্রকাশ করতে পারি।

আপডেট: diff -qrখুব বিশ্বাসযোগ্য আউটপুট উত্পাদন করে না। আউটপুট diff -qrএছাড়াও প্রক্রিয়া করা প্রয়োজন। এর চেয়ে ভাল উপায় আর কি আছে?


"সুবিধাজনক" আউটপুট উদাহরণ কি?
frogstarr78

উত্তর:


8

I thisve এর জন্য একটি সহজ পন্থা পেয়েছে: rsync- পূর্বরূপ মোড ব্যবহার করুন:

rsync -aHSvn --delete old_dir/ new-dir/

সেই আদেশ দ্বারা "মুছতে হবে" হিসাবে প্রদর্শিত ফাইলগুলি হ'ল "নতুন" ফাইল। অন্য যেগুলি স্থানান্তরিত হবে সেগুলি কোনওভাবে পরিবর্তিত হয়েছে। আরও তথ্যের জন্য rsync-man-পৃষ্ঠা দেখুন।


13

আপনি ব্যবহার করতে পারেন পরিবর্তন toool: বিকল্প -q এবং -r দেখতে

-q  --brief
Output only whether files differ.

-r  --recursive
Recursively compare any subdirectories found.

উদাহরণ:

diff -qr dir1 dir2

একেবারে ভয়াবহ এবং অপঠনযোগ্য আউটপুট, বাজে তথ্যের সাথে বিশৃঙ্খলাবদ্ধ Only inযা বলছে যে ডিরেক্টরিগুলি আদর্শ কপিগুলি হলেও প্রদর্শিত হয়। আমার একটি পুরানো সংশোধনের বিপরীতে পরিবর্তনগুলির তুলনা করার প্রয়োজন ছিল, এবং সম্পূর্ণ সংশোধনটি একটি পৃথক ডিরেক্টরিতে ডাউনলোড করা এবং তুলনা করার জন্য স্ট্যান্ডার্ড এসভিএন সরঞ্জাম ব্যবহার করে শেষ করা দরকার। যাবার একমাত্র উপায় মনে হচ্ছে…
হাই-অ্যাঞ্জেল

3

diffutilsপ্যাকেজের মাধ্যমে একটি অন্তর্ভুক্ত lsdiffহাতিয়ার। কেবলমাত্র diff -uএলএসডিফের আউটপুটটি পাস করুন :

diff -u --other-diff-options path1 path2 | lsdiff

ভাল পরামর্শ, ধন্যবাদ। patchutilsআমার জন্য প্যাকেজে ছিল (সেন্টস 5.x)।
স্টিভ কেহলেট

হ্যাঁ, উবুন্টু / ডেবিয়ানের জন্যও প্যাচুইটিস প্যাকেজ।
আর্টফুলবোট

1

আমি প্রতিটি আপডেটের সময় কেবল একটি ফাইল স্পর্শ করব এবং তারপরে আপনি সেই ফাইলগুলি সন্ধান করতে পারেন যা এর পরে ified find /tree/location -newer /last/update/file -print


1

যে ফাইলগুলির পরিবর্তন হয়েছে কেবল তার নাম নিতে আমি এই আদেশটি ব্যবহার করি:

diff -r dirt1 dir2 --brief | sed 's/^Only in \([^:]*\): /\1\//' | sed 's/^Files \(.*\) and .* differ/\1/'

যদি কিছু ফাইলকে অবজেক্ট ফাইল বা লাইব্রেরি ফাইল হিসাবে বাদ দিতে হয় তবে আপনি ব্যবহার করতে পারেন:

diff -r dirt1 dir2 --brief --exclude "*.o" --exclude "*.a" | sed 's/^Only in \([^:]*\): /\1\//' | sed 's/^Files \(.*\) and .* differ/\1/'

1

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

(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



0

এটি কৌশলটি করতে পারে:

compare_dirs()
{
    # Shows which files and directories exist in one directory but not both
    if [ $# -ne 2 ]
    then
        echo "Usage: compare_dirs dir1 dir2" >&2
        return 2
    fi
    for path
    do
        if [ ! -d "$path" ]
        then
            echo "Not a directory: $path" >&2
            return 1
        fi
    done
    comm -3 \
        <(cd -- "$1" && find . -printf '%P\0' | sort -z | quote_shell) \
        <(cd -- "$2" && find . -printf '%P\0' | sort -z | quote_shell)
}

0

সাধারণত আপনি ফাইলগুলিকে একধরনের সংস্করণ নিয়ন্ত্রণ সিস্টেমে যেমন সাবভারিয়ন বা গিট ফাইলগুলি রেখে দেন, যেহেতু এটি বাক্স থেকে আপনার জন্য করতে পারে।

তবে আপনি dir1 এ লুপের সাথে একটি দ্রুত স্ক্রিপ্ট করতে পারেন এবং তারপরে প্রতিটি ফাইলকে ডিয়ার 2 এর সাথে তুলনা করতে পারেন। ফাইলগুলি আলাদা ছিল কিনা তা জানতে লুপটি প্রস্থান থেকে প্রস্থান কোডটি দেখতে পারে।

এরকম কিছু হতে পারে:

for f in `(cd dir1 ; find .)`
do 
  diff $f ../dir2/$f
  if [ "$?" == "0" ]
  then 
    echo same
  else 
    echo diff: $f
  fi
done

দ্রষ্টব্য: স্ক্রিপ্টটি পরীক্ষা করা হয়নি, সুতরাং উপরের উদাহরণটি "বাশ অনুপ্রাণিত সিউডোকোড" ...


আসুন আর যাই কিন্তু গিট সহ

খেলতে কয়েকটি উদাহরণ ফাইল তৈরি করুন

mkdir -p dir1/test1/test11
mkdir -p dir1/test1/test12
mkdir -p dir1/test1/test13
echo "Test1" >> dir1/test1/test11/t1.txt
echo "Test2" >> dir1/test1/test12/t2.txt
echo "Test3" >> dir1/test1/test13/t3.txt

#And a dir to work in
mkdir gitdir

তারপরে dir প্রবেশ করুন এবং dir1 আমদানি করুন

cd gitdir/
git init .
cp -r ../dir1/* .
git add .
git commit -m 'dir1'

বাইরে যান এবং dir1 সংশোধন করুন (সুতরাং এটি আপনার dir2 হয়ে যায়)

cd ..
echo "Test2" > dir1/test1/test11/t1.txt

তারপরে গিট দিরের মধ্যে যান এবং নতুন দিরটি আমদানি করুন

cd gitdir/
cp -r ../dir1/* .

এখন গিটকে জিজ্ঞাসা করুন কী পরিবর্তন হয়েছে (স্ট্যাটাস কমান্ড সহ)

git status -s

আউটপুটটি পরিবর্তনগুলির সাথে একটি তালিকা রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

 M test1/test11/t1.txt

0

অন্য কিছু থেকে আপনি আরও সুখী হতে পারেন। ব্যবহার করে দেখুন git

উদাহরণ হিসাবে এটি করুন:

mkdir a
cd a
git init
touch b
git add . && git commit -m "Empty file"
git status
echo c >> b
git status
git add . && git commit -m "Full file"
git status

gitআপনার জন্য আপনার ফাইল ট্র্যাক করবে। কমান্ডটি git statusআপনাকে সমস্ত ফাইলগুলি প্রদর্শন করবে যা শেষ প্রতিশ্রুতি থেকে সংশোধিত হয়েছে।


0

এটি আরএসআইএনসি'র মতো: গন্তব্যে নতুন ফাইলটি যখন ওভাররাইট করা হবে তখন দেখান (নকল না হলেও পরে জিজ্ঞাসা করা হয়)।

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

rsyncএই উদ্দেশ্যে দরকারী সরঞ্জাম কারণ এটি তুলনায় অনেক দ্রুত diff। তবে @ নীল দ্বারা প্রস্তাবিত সমাধানটি পুরানো / নতুন ডিরেক্টরি গাছের মধ্যে প্রকৃত পার্থক্যের চেয়ে অনেক বেশি ভার্বোজ (এবং আরও ফাইলের তালিকাভুক্ত)। উদাহরণস্বরূপ, আমি সেই উত্তরের জন্য যে স্ক্রিপ্টটি লিখেছিলাম তার সাথে তার তুলনা করা এবং একই ডেটাতে চালানো,

  • @ নিল উত্তর 605 টি লাইন তৈরি করে (দৃশ্যত কারণ এতে ডিরেক্টরি পরিবর্তন রয়েছে ),
  • "ডিফফ-কি-আর" বেশ কয়েক মিনিট দৌড়ানোর পরে 352 লাইন তৈরি করে এবং
  • আমার স্ক্রিপ্ট 252 টি লাইন দেখায় ( প্রকৃত ফাইলগুলি পরিবর্তিত, যুক্ত বা মুছে ফেলা)

নতুন ফাইলগুলির diffজন্য সঠিকভাবে অ্যাকাউন্ট তৈরি করতে আপনার পাশাপাশি বিকল্পেরও প্রয়োজন (যা আমি প্রস্তাবিত উত্তরের কোনওটিতে দেখতে পাচ্ছি না)। যাইহোক, যেহেতু এটি তুলনায় অনেক ধীর (প্রস্থের আদেশ) , তারপরের আউটপুটটি উন্নত করার উপায়টি মনে হচ্ছে।-Nrsync

আরও পড়া


0

আমি সবসময় sha1sum (বা এমনকি md5sum; এই প্রসঙ্গে এটি বেশ নিরাপদ) আংশিক ছিলাম।

find . -type f -print0 | xargs -0 md5sum | sort -k2 > /tmp/before
# don't miss the "sort" in there; it's important

# (later)
find . -type f -print0 | xargs -0 md5sum | sort -k2 > /tmp/after
vimdiff /tmp/before /tmp/after
# or whatever diff tool you like, even "diff -u"

কখনও কখনও - যেমন আপনার যদি অনেক বেশি ফাইলের নাম পরিবর্তন করা হয় বা সরিয়ে নেওয়া হয় - প্রথম ক্ষেত্রের উপর বাছাই করা এবং তারপরে পৃথক করা সাহায্য করতে পারে তবে বেশিরভাগ সময় এটি যথেষ্ট ভাল।

মনে রাখবেন, অন্যান্য কয়েকটি পদ্ধতির তুলনায়, এর সুবিধা রয়েছে যে আপনার "আগে" ফাইলগুলির একটি অনুলিপি রাখার দরকার নেই; কেবল এমডি 5সাম আউটপুট ফাইল।

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