मेरी समस्या (एक स्क्रिप्ट में #!/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 sums की गणना करता है (अधिकतम सीमा को बदला जा सकता है)। 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' {} +