IFS=$(echo -en "\n\b")
जब से आप एक खोल के साथ ग्रहण कर रहे हैं echo -e
, और आप वैसे भी अपनी शेबंग लाइन में बैश हैं, आप उपयोग कर सकते हैं IFS=$'\n\b'
। बैकस्पेस को एक विभाजक बनाना अजीब है। आप IFS
वैसे भी क्या कर रहे हैं के लिए की जरूरत नहीं है।
OLDIFS=$IFS
...
IFS=$OLDIFS
ध्यान दें कि यह IFS
केवल पुराने मूल्य को पुनर्स्थापित करता है यदि IFS
शुरू में सेट किया गया था। यदि IFS
शुरू में परेशान था, तो यह IFS
खाली स्ट्रिंग पर सेट होता है, जो पूरी तरह से अलग है। Ksh, bash या zsh में, यदि आपको IFS
अस्थायी रूप से सेट करने की आवश्यकता है, तो आप किसी फ़ंक्शन में अपना कोड लिख सकते हैं और IFS
इस फ़ंक्शन को स्थानीय बना सकते हैं । अन्य गोले में, आपको परेशान मामले से सावधान रहने की आवश्यकता है।
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
के आउटपुट पर कमांड प्रतिस्थापन का उपयोग कभी न करें find
।
- यह वर्णों में आउटपुट को विभाजित करता है
$IFS
। यदि आप IFS
एक नई पंक्ति में सेट करते हैं, तो यह आउटपुट को नई सीमा में विभाजित करता है, लेकिन आप अभी भी नई नाम वाली फ़ाइल नामों को संभाल नहीं सकते हैं।
- न केवल आदेश प्रतिस्थापन का परिणाम शब्दों में विभाजित है, बल्कि फिर प्रत्येक शब्द को एक ग्लोब पैटर्न के रूप में उपयोग किया जाता है। यदि आप फ़ाइलें कहते हैं
A[12].pdf
, A1.pdf
और A2.pdf
, आप के साथ समाप्त हो जाएगा A1.pdf A2.pdf A1.pdf A2.pdf
। आप ग्लोबिंग को बंद कर सकते हैं set -f
(और साथ में वापस set +f
), लेकिन यहां (ज्यादातर समय की तरह) सही तरीका है कमांड प्रतिस्थापन का उपयोग न करना।
-exec
तर्क का उपयोग करें find
(या यदि आपके सिस्टम में है -print0
, तो आप find … -print0 | xargs -0 …
इसके बजाय उपयोग कर सकते हैं ; यह केवल एक बार में कई फ़ाइलों पर कार्य करने के लिए उपयोगी है, यदि आपको प्राचीन लिनक्स सिस्टम या वर्तमान ओपनबीएसडी सिस्टम की पोर्टेबिलिटी की आवश्यकता है, -print0
लेकिन ऐसा नहीं है -exec … {} +
)।
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
ध्यान दें कि आप डबल कोट्स को याद कर रहे हैं $f
(उन्हें ज़रूरत नहीं है अगर ये विभाजन के परिणाम हैं और आप IFS
तब से नहीं बदले हैं और ग्लोबिंग बंद हो गया है, लेकिन वास्तव में, हमेशा दोहरे उद्धरण डालते हैं जब तक कि आपको पता नहीं है कि आप क्यों कर सकते हैं ' t उन्हें छोड़ दो)।
यह अनाड़ी और गैर-पोर्टेबल है ( stat
सभी प्रणालियों पर मौजूद नहीं है, और इसके तर्क अलग-अलग प्रणालियों में भिन्न हैं जहां यह मौजूद है)। touch
फ़ाइल को किसी अन्य फ़ाइल के टाइमस्टैम्प पर सेट करने के लिए एक पोर्टेबल विकल्प है touch -r REFERENCE_FILE FILE
:। मैं इसके बजाय दो में से एक दृष्टिकोण की सिफारिश करूंगा:
- यदि आप कर सकते हैं, तो पहले मूल फ़ाइल को एक नई फ़ाइल में रूपांतरित करें, फिर नई फ़ाइल
touch -r
की तारीख निर्धारित करने के लिए कॉल करें , और अंत में नई फ़ाइल को स्थानांतरित करें। यह सुनिश्चित करना बेहतर है कि इनपुट के कुछ होने से पहले आउटपुट ठीक है; अन्यथा, यदि परिवर्तन किसी भी कारण से बाधित है (उदाहरण के लिए एक बिजली की विफलता), तो आप डेटा खो देंगे।
- यदि परिवर्तन एक ब्लैक बॉक्स है जिस पर आपका कोई नियंत्रण नहीं है, तो आप
touch -r
दो बार उपयोग कर सकते हैं : एक बार एक खाली अस्थायी फ़ाइल (जो स्वचालित रूप से बनाई जाएगी) पर मूल फ़ाइल की तारीख को बचाने के लिए, फिर परिवर्तन के बाद दिनांक को पुनर्स्थापित करने के लिए अस्थायी फ़ाइल का उपयोग करना।
इस प्रकार:
find /mnt/library/Libra/Libra/Ashfords -name '*.pdf' \
-exec sh -c 'transform "$0" to "$0.tmp" && touch -r "$0" "$0.tmp" && mv -f "$0.tmp" "$0"' {} \;
IFS
असामान्य लगता है। क्या आप वास्तव में बैकस्पेस (\b
) पर विभाजित करना चाहते हैं ? कुछ सुझावों के लिए unix.stackexchange.com/questions/9496/… देखें ।