আমার সমস্যা (এর সাথে একটি স্ক্রিপ্টে #!/bin/sh
) নিম্নরূপ: আমি সংরক্ষণাগার সংক্রান্ত উদ্দেশ্যে ডিরেক্টরিতে সমস্ত ফাইল চেকসাম করার চেষ্টা করি। সমস্ত ফাইলের নাম সহ চেকসাম (আমার ক্ষেত্রে sha1) ফাইলটি একই ডিরেক্টরিতে থাকা উচিত। বলুন আমাদের ~/test
ফাইল f1
এবং f2
: সহ একটি ডিরেক্টরি আছে ।
mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2
এখন দিয়ে চেকসাম গণনা করা হচ্ছে
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum
আমি যা চাই ঠিক তা করে, এটি কেবল বর্তমান ডিরেক্টরিটির সমস্ত ফাইল তালিকাভুক্ত করে এবং sha1 অঙ্কগুলি গণনা করে (ম্যাক্সডেপথ পরে পরিবর্তিত হতে পারে)। STDOUT এ আউটপুটটি হ'ল:
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
দুর্ভাগ্যক্রমে, যখন এটি কোনও ফাইলে সংরক্ষণ করার চেষ্টা করা হয়
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1
ফলস্বরূপ ফাইলটি নিজের জন্য চেকসাম প্রদর্শন করে:
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
এবং অতএব পরে ব্যর্থ হয় shasum --check
, কারণ শেষ অঙ্কটি সংরক্ষণের সময় অতিরিক্ত ফাইল পরিবর্তনের সুস্পষ্ট সমস্যার কারণে।
আমি চারপাশে এবং এর -p
জন্য পতাকা ব্যবহার করে xargs
জানতে পেরেছিলাম যে এটি ফাইন্ড কমান্ড কার্যকর করার আগে আউটপুট ফাইলটি তৈরি করে, তাই অতিরিক্ত ফাইলটি পাওয়া যায় এবং চেকসামড করা হবে ...
আমি জানি যে কর্মক্ষেত্র হিসাবে আমি চেকসামটি অন্য কোনও স্থানে (অস্থায়ী ডিরেক্টরি মাধ্যমে mktemp
) সংরক্ষণ করতে পারি বা এটি সুনির্দিষ্টভাবে অনুসন্ধানে বাদ দিতে পারি, তবে আমি বুঝতে চাই যে এটি কেন এটির মতো আচরণ করে - যা আমার চোখে এটি কার্যকর নয়, উদাহরণস্বরূপ, যদি প্রথম কমান্ডটি আউটপুট ফাইলটি ইতিমধ্যে ডিস্কে রয়েছে কিনা তা পরীক্ষা করে দেখায়, এটি কখনই সঠিক উত্তর পাবে না ...
sh
প্রয়োজন হলে তা কাজ করার গ্যারান্টিযুক্ত নয় । নোট করুন যে আপনার জন্য $0
আগে একটি যুক্তি প্রয়োজন {}
।
tee
তা অদৃশ্য হয়ে গেছে? আমি এটি চেষ্টা করেছিলাম এবং এটি ঠিক কাজ করে, আমি যোগ করার সাথে STDOUT কেও দমন করেছি 1>/dev/null
। উত্তরে কিছু ভুল ছিল নাকি এটি বাগ ছিল?
xargs
, এটি নিজেই শেল যা এই ফাইলটি তৈরি করে, কারণ কোনও কমান্ড কার্যকর করার আগে শেল সমস্ত ইনপুট, আউটপুট এবং পাইপগুলি পুনর্নির্দেশ করে, যাতেfind
আউটপুট ফাইলটি শুরু হওয়ার আগেই উপস্থিত থাকে।-exec
পরিবর্তে ব্যবহার করুন:find -maxdepth 1 -type f -exec sh -c 'shasum "$@" > sums.sha1' {} +