আমি কিভাবে একটি ডিরেক্টরিতে একটি এমডি 5 চেকসাম গণনা করতে পারি?


133

একটি বিশেষ ধরণের সমস্ত ফাইলের ( *.pyউদাহরণস্বরূপ) ডিরেক্টরি এবং সমস্ত উপ-ডিরেক্টরিগুলির অধীনে রাখার জন্য আমার একটি সারাংশ এমডি 5 চেকসাম গণনা করতে হবে।

এটি করার সর্বোত্তম উপায় কী?

সম্পাদনা করুন: প্রস্তাবিত সমাধানগুলি খুব সুন্দর, তবে এটি আমার যা প্রয়োজন ঠিক তা নয়। আমি একটি একক সংক্ষিপ্ত চেকসাম পাওয়ার সমাধান খুঁজছি যা সম্পূর্ণরূপে ডিরেক্টরিটি স্বতন্ত্রভাবে সনাক্ত করবে - এর সমস্ত উপ-ডিরেক্টরিগুলির সামগ্রী সহ।


কটাক্ষপাত এই এবং এই আরো বিস্তারিত ব্যাখ্যার জন্য।
lovieere

3
আমার কাছে একটি সুপারভাইজার প্রশ্নের মতো মনে হচ্ছে।
নলডোরিন

8
নোট করুন যে চেকসামগুলি স্বতন্ত্রভাবে কোনও কিছু সনাক্ত করতে পারে না।
হোসাম অলি

1
আপনার দুটি ডিরেক্টরি গাছ কেন থাকবে যা আপনি অনন্যভাবে চিহ্নিত করতে চান এমন "একই" নাও হতে পারে? ফাইল তৈরি / সংশোধন / অ্যাক্সেস সময় বিবেচনা করে? আপনার সত্যিকারের যা প্রয়োজন সংস্করণটি কি তা নিয়ন্ত্রণ করে?
jmucchiello

আমার ক্ষেত্রে যা সত্য তা হল পুরো ডিরেক্টরি গাছের সামগ্রীর সাথে মিল, যার অর্থ নীচে আফিকে মুছে ফেলা হয়েছে
11

উত্তর:


152
find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum

ফাইন্ড কমান্ড সমস্ত ফাইলগুলি তালিকাভুক্ত করে যা .py এ শেষ হয়। এমডি 5sum প্রতিটি .py ফাইলের জন্য গণনা করা হয়। md5sums বাছাই করতে awk ব্যবহার করা হয় (ফাইলের নাম উপেক্ষা করে, যা অনন্য হতে পারে না)। Md5sums বাছাই করা হয়। এই সাজানো তালিকার md5sum এর পরে ফিরে আসে।

আমি একটি পরীক্ষা ডিরেক্টরিটি অনুলিপি করে এটি পরীক্ষা করেছি:

rsync -a ~/pybin/ ~/pybin2/

আমি কিছু ফাইলের নাম ~ / পাইবিন 2 এ রেখেছি।

find...md5sumকমান্ড উভয় ডিরেক্টরি জন্য একই আউটপুট প্রদান করে।

2bcf49a4d19ef9abd284311108d626f1  -

24
নোট করুন যে কোনও ফাইলের নাম পরিবর্তিত হলে একই চেকসাম তৈরি করা হবে। সুতরাং আপনি যদি স্বাক্ষরটির ফাইলের বিন্যাস অংশ বিবেচনা করেন তবে এটি "চেকসামটি পুরোপুরি অনন্যভাবে পুরো ডিরেক্টরিটিকে চিহ্নিত করবে" এর সাথে এটি খাপ খায় না।
ভ্যালেন্টিন মাইলিয়া

1
আপনি ফাইলের নামের সাথে প্রতিটি ফাইলের চেকসামের উপস্থাপিত করতে কমান্ড-লাইনটি সামান্য পরিবর্তন করতে পারেন (বা আরও ভাল, / पथ / থেকে / ডির / ফাইল থেকে ফাইলের আপেক্ষিক পথ) তাই এটি চূড়ান্ত চেকসামে বিবেচনায় নেওয়া হয়।
মাইকেল জিলবারম্যান

4
@ জিম ২০০১: হ্যাঁ, এটি পরিবর্তন করা যেতে পারে, তবে আমি সমস্যাটি বুঝতে পেরেছি (বিশেষত প্রশ্নের অধীনে ওপির মন্তব্যের কারণে), ওপি চাইছিল যে কোনও দুটি ডিরেক্টরিই সমান হিসাবে বিবেচিত হবে যদি ফাইলের বিষয়বস্তু নির্বিশেষে ফাইলগুলির বিষয়বস্তু অভিন্ন হত বা এমনকি আপেক্ষিক পথ।
unutbu

@ ইউনতবু: আমি জানি; আমি ভ্যালেন্টিন মিলিয়া থেকে পূর্ববর্তী নোটটিতে প্রতিক্রিয়া জানছিলাম।
মাইকেল জিলবারম্যান

awk ...আপনি যদি স্বাক্ষরের লেআউট অংশ বিবেচনা করেন তবে ভ্যালেন্টিনমিলিয়া কেবলমাত্র সেই অংশটি সরিয়ে ফেলুন ।
সেগফল্ট 21

166

ফ্লাই এবং পাইপে একটি টার আর্কাইভ ফাইল তৈরি করুন যা এতে md5sum:

tar c dir | md5sum

এটি একটি একক md5sum উত্পাদন করে যা আপনার ফাইল এবং সাব ডিরেক্টরি ডিরেক্টরিতে স্বতন্ত্র হওয়া উচিত। ডিস্কে কোনও ফাইল তৈরি হয় না।


25
একক চেক-সমষ্টি সহ @ চার্লসবি আপনি কখনই জানেন না কোন ফাইলটি আলাদা। প্রশ্নটি ছিল ডিরেক্টরিটির জন্য একটি একক চেক-যোগ সম্পর্কে।
হক্কেন

17
ls -alR dir | md5sum। এটি কেবল আরও ভাল কোনও সংক্ষেপণ নয় just এটি অনন্য কারণ সামগ্রীতে ফাইলের মোড সময় এবং আকার রয়েছে;)
সিড

14
@ ড্যাপস0 এল - আমার আদেশে কোনও সংক্ষেপণ নেই is আপনাকে zজিজিপ, বা jবিজিপ 2 এর জন্য যুক্ত করতে হবে। আমিও করিনি।
ire_and_curses

7
সাবধান হয়ে নিন যে এটি করার ফলে চেকসাম গণনায় ফাইল এবং অন্যান্য স্টাফের টাইমস্ট্যাম্প সংহত হবে, কেবলমাত্র ফাইলের বিষয়বস্তুই নয়
মাইকেল জিলবারম্যান

10
এটি সুন্দর, কিন্তু এটি সত্যিই কাজ করে না। tarদু'বার, বা দুটি পৃথক কম্পিউটারে একই সেট ফাইলগুলিকে একই আইনের ফলাফল দেওয়ার ফলে কোনও গ্যারান্টি নেই ।
ফললেট

46

Iire_and_curses এর ব্যবহারের পরামর্শটিতে tar c <dir>কিছু সমস্যা রয়েছে:

  • টার ফাইল ডিরেক্টরি সিস্টেমে ডিরেক্টরি ফাইলগুলি প্রক্রিয়াকরণ করে যা তারা ফাইল সিস্টেমে সঞ্চিত রয়েছে এবং এই ক্রমটি পরিবর্তন করার কোনও উপায় নেই। যদি বিভিন্ন জায়গায় আপনার "একই" ডিরেক্টরি থাকে তবে এটি কার্যকরভাবে সম্পূর্ণরূপে পৃথক ফলাফল আনতে পারে এবং আমি এটিকে ঠিক করার কোনও উপায় জানি না (টার একটি নির্দিষ্ট ক্রমে এর ইনপুট ফাইলগুলিকে "সাজানো" করতে পারে না)।
  • আমি সাধারণত গ্রুপিড এবং মালিকের সংখ্যাগুলি একই কিনা সে বিষয়ে যত্নশীল, প্রয়োজন হয় না গ্রুপ / মালিকের স্ট্রিং প্রতিনিধিত্ব একই কিনা। উদাহরণস্বরূপ rsync -a --deleteএটি করার সাথে এটি সামঞ্জস্যপূর্ণ: এটি কার্যত সমস্ত কিছুকে বিয়োগ করে (মাইনাস এক্সটারস এবং অ্যাকসেল), তবে এটি স্ট্রিং প্রতিনিধিত্বের ভিত্তিতে নয় বরং তাদের আইডির ভিত্তিতে মালিক এবং গোষ্ঠীটিকে সিঙ্ক করবে। সুতরাং আপনি যদি অন্য কোনও সিস্টেমে সিঙ্ক করে থাকেন তবে অগত্যা একই ব্যবহারকারী / গোষ্ঠী নেই তবে আপনার --numeric-ownerপতাকাটি টারে যুক্ত করা উচিত
  • ডারটি আপনি যে ডিরেক্টরিটি নিজে যাচাই করছেন তার ফাইলের নাম অন্তর্ভুক্ত করবে, সচেতন হওয়ার মতো কিছু।

যতক্ষণ না প্রথম সমস্যার কোনও সমাধান নেই (বা আপনি নিশ্চিত না হন যে এটি আপনাকে প্রভাবিত করে না), আমি এই পদ্ধতির ব্যবহার করব না।

findউপরে প্রস্তাবিত ভিত্তিক সমাধান এছাড়াও কোন ভাল, কারণ তারা শুধুমাত্র ফাইল, না ডিরেক্টরি, যা একটি বিষয় যদি checksumming মন খালি ডিরেক্টরিগুলি থেকে রাখা উচিত হয়ে তালিকায় রয়েছে।

পরিশেষে, সর্বাধিক প্রস্তাবিত সমাধানগুলি ধারাবাহিকভাবে বাছাই করে না কারণ সিস্টেমগুলি জুড়ে কোলেশন আলাদা হতে পারে।

এই সমাধানটি আমি নিয়ে এসেছি:

dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum

এই সমাধান সম্পর্কে নোট:

  • LC_ALL=Cসিস্টেম জুড়ে নির্ভরযোগ্য সাজানোর ক্রম নিশ্চিত
  • এটি "w nwithanewline নামক একটি ডিরেক্টরি" এবং "নামের" এবং "উইথনওলাইন" নামের দুটি ডিরেক্টরিতে পার্থক্য দেখায় না, তবে ঘটনার সম্ভাবনা খুব কমই বলে মনে হয়। একটি সাধারণত এটি -print0পতাকা সহ স্থির করে দেয় findতবে যেহেতু এখানে অন্যান্য জিনিস চলছে, আমি কেবলমাত্র এমন সমাধান দেখতে পাচ্ছি যা কমান্ডটিকে আরও জটিল করে তুলবে তবে তা মূল্যবান।

পিএস: আমার সিস্টেমে একটি সীমিত ব্যস্তবাক্স ব্যবহার findকরে যা পতাকা সমর্থন করে না -execএবং -print0পতাকাও সমর্থন করে না , এবং ডিরেক্টরিগুলি বোঝাতে এটি '/' যুক্ত করে, যখন সন্ধানীর সন্ধানগুলি মনে হয় না, সুতরাং এই মেশিনটির জন্য আমাকে চালানো দরকার:

dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum

ভাগ্যক্রমে, আমার নামে নতুন ফাইলগুলি যুক্ত ফাইল / ডিরেক্টরি নেই, সুতরাং এটি সেই সিস্টেমে কোনও সমস্যা নয়।


1
+1: খুব আকর্ষণীয়! আপনি কি বলছেন যে অর্ডারটি বিভিন্ন ফাইল সিস্টেমের প্রকারের মধ্যে বা একই ফাইল সিস্টেমের মধ্যে পৃথক হতে পারে?
ire_and_curses

2
উভয়। এটি কেবল প্রতিটি ডিরেক্টরিতে ডিরেক্টরি প্রবেশের ক্রমের উপর নির্ভর করে। আফাইক ডিরেক্টরি ডিরেক্টরি (ফাইল সিস্টেমে) সবেমাত্র তৈরি করা হয়েছে যাতে আপনি "ডিরেক্টরিতে ফাইল তৈরি করেন" in একটি সাধারণ উদাহরণ: k এমকিডির এ; একটি / ফাইল -1 স্পর্শ করুন; a / file-2 $ mkdir বি টাচ করুন; বি / ফাইল -২ টাচ করুন; বি / ফাইল -1 $ (সিডি এ; তারার-সি। এমডি 5সাম) fb29e7af140aeea5a2647974f7cdec77 - $ (সিডি বি; তারার-সি। এমডি 5সাম) এ 3 এ 39358158a87059b9f111ccffa1023
ডাইটার_১১

14

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

find /path -type f | sort -u | xargs cat | md5sum

10

সম্পূর্ণতার জন্য, এমডি 5 ডিডিপি (1) রয়েছে ; এটি * .পি ফিল্টার প্রয়োজনীয়তার কারণে সরাসরি প্রযোজ্য নয় তবে এটি ফাইন্ডের সাথে একসাথে করা উচিত (1)।


আমি যদি কেবল একটি ডিরেক্টরিতে এমডি 5 চেকসাম গণনা করতে চাই তবে আমি কোন পরামিতি ব্যবহার করব?
গ্যাব্রিয়েল ফেয়ার

9

একটি সমাধান যা আমার পক্ষে সবচেয়ে ভাল কাজ করেছে:

find "$path" -type f -print0 | sort -z | xargs -r0 md5sum | md5sum

কেন এটি আমার পক্ষে সেরা কাজ করেছে:

  1. ফাঁকা ফাইলগুলির ফাইল পরিচালনা করে
  2. ফাইল সিস্টেম মেটা-ডেটা উপেক্ষা করে
  3. ফাইলটির নতুন নামকরণ হয়েছে কিনা তা সনাক্ত করে

অন্যান্য উত্তর সহ সমস্যাগুলি:

ফাইল সিস্টেম মেটা-ডেটা এ জন্য উপেক্ষা করা হয় না:

tar c - "$path" | md5sum

শূন্যস্থান সম্বলিত ফাইলের নামগুলি পরিচালনা করে না বা ফাইলটির পুনরায় নামকরণ করা হয়েছে কিনা তা সনাক্ত করে:

find /path -type f | sort -u | xargs cat | md5sum

4

আপনি যদি পুরো ডিরেক্টরিটি ছড়িয়ে কোনও এমডি 5সাম চান তবে আমি এর মতো কিছু করব

cat *.py | md5sum 

1
সাবডিয়ারদের জন্য cat **.py| এর মতো কিছু ব্যবহার করুন md5sum
রামন

3

সামগ্রী এবং তাদের ফাইলের নাম উভয় সহ সমস্ত ফাইল চেকসাম

grep -ar -e . /your/dir | md5sum | cut -c-32

উপরের মত একই, তবে কেবল * .py ফাইলগুলি অন্তর্ভুক্ত

grep -ar -e . --include="*.py" /your/dir | md5sum | cut -c-32

আপনি চাইলে সিমলিংকগুলিও অনুসরণ করতে পারেন

grep -aR -e . /your/dir | md5sum | cut -c-32

গ্রিপ দিয়ে আপনি অন্যান্য বিকল্পগুলি বিবেচনা করতে পারেন

-s, --no-messages         suppress error messages
-D, --devices=ACTION      how to handle devices, FIFOs and sockets;
-Z, --null                print 0 byte after FILE name
-U, --binary              do not strip CR characters at EOL (MSDOS/Windows)


2

প্রযুক্তিগতভাবে আপনার কেবল চালানো দরকার ls -lR *.py | md5sum। আপনি যদি কেউ ফাইল পরিবর্তন করে এবং তাদের আসল তারিখগুলিতে আবার স্পর্শ করেন এবং কখনও ফাইলের আকার পরিবর্তন না করে উদ্বিগ্ন হন না তবে আউটপুট lsআপনাকে জানাতে হবে যে ফাইলটি পরিবর্তন হয়েছে কিনা। আমার ইউনিক্স-ফু দুর্বল তাই আপনার মুদ্রণের সময় ও পরিবর্তনের সময় পেতে আরও কিছু কমান্ড লাইন প্যারামিটারের প্রয়োজন হতে পারে। lsফাইলগুলিতে অনুমতি পরিবর্তন হয়েছে কিনা তাও আপনাকে জানাতে হবে (এবং আমি নিশ্চিত যে আপনি যদি সে বিষয়ে যত্ন না রাখেন তবে তা বন্ধ করার জন্য সুইচগুলি রয়েছে)।


3
এটি কিছু ব্যবহারের ক্ষেত্রে উপযুক্ত হতে পারে তবে সাধারণত আপনি চেকসামটি কেবলমাত্র সামগ্রীকেই প্রতিবিম্বিত করতে চান এবং তারিখগুলি একেবারেই নয়। উদাহরণস্বরূপ, যদি আমি touchএকটি ফাইলটি তার তারিখ (কিন্তু পরিবর্তন করতে না এটির সামগ্রীগুলি) তারপর আমি চেকসাম অপরিবর্তিত বলে আশা করা যাবে।
টড ওভেন


1

আমার একই সমস্যা ছিল তাই আমি এই স্ক্রিপ্টটি নিয়ে এসেছি যা কেবলমাত্র ডিরেক্টরিতে ফাইলগুলির md5sums তালিকা করে এবং যদি এটি একটি উপ-ডিরেক্টরি খুঁজে পায় তবে সেখান থেকে আবার এটি চালিত হয়, এটির জন্য স্ক্রিপ্টটি বর্তমানের মধ্য দিয়ে চলতে সক্ষম হতে হবে ডিরেক্টরি বা একটি উপ-ডিরেক্টরি থেকে যদি বলা হয় আর্গুমেন্টটি $ 1 এ পাস করা হয়

#!/bin/bash

if [ -z "$1" ] ; then

# loop in current dir
ls | while read line; do
  ecriv=`pwd`"/"$line
if [ -f $ecriv ] ; then
    md5sum "$ecriv"
elif [ -d $ecriv ] ; then
    sh myScript "$line" # call this script again
fi

done


else # if a directory is specified in argument $1

ls "$1" | while read line; do
  ecriv=`pwd`"/$1/"$line

if [ -f $ecriv ] ; then
    md5sum "$ecriv"

elif [ -d $ecriv ] ; then
    sh myScript "$line"
fi

done


fi

আমি পুরোপুরি নিশ্চিত যে এই স্ক্রিপ্টটি ব্যর্থ হবে যদি ফাইলের নামগুলিতে ফাঁক বা কোট থাকে। আমি ব্যাশ স্ক্রিপ্টিং দিয়ে এই বিরক্তিকর মনে করি, তবে আমি যা করি তা আইএফএস পরিবর্তন করে।
লোকালহোস্ট

1

আপনি যদি ফাইল সিস্টেমের বৈশিষ্ট্যগুলি এবং কিছু ট্যারি সংস্করণের বিট-স্তরের পার্থক্য থেকে সত্যই স্বাধীনতা চান তবে আপনি সিপিও ব্যবহার করতে পারেন:

cpio -i -e theDirname | md5sum

0

আরও দুটি সমাধান রয়েছে:

সৃষ্টি:

du -csxb /path | md5sum > file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum > /tmp/file

পরীক্ষা করে দেখুন:

du -csxb /path | md5sum -c file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum -c /tmp/file

0

md5sumআমার পক্ষে ভাল কাজ করেছে, তবে আমার কাছে sortফাইলের নামগুলি বাছাই করার সমস্যা ছিল । সুতরাং পরিবর্তে আমি md5sumফলাফল অনুসারে বাছাই । তুলনীয় ফলাফল তৈরি করতে আমার কিছু ফাইলও বাদ দিতে হয়েছিল।

find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum

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