यह देखते हुए कि आपका फ़ाइल नाम प्रारूप में है file.00064.name.99999.end
, हमें सबसे पहले अपने नंबर को छोड़कर सब कुछ ट्रिम करना होगा। हम ऐसा करने के लिए एक for
लूप का उपयोग करेंगे ।
हमें बेस 10 का उपयोग करने के लिए बैश शेल को भी बताने की आवश्यकता है, क्योंकि बैश अंकगणित उन्हें संख्या 0 से आधार 8 के रूप में व्यवहार करेगा, जो हमारे लिए चीजों को गड़बड़ कर देगा।
एक स्क्रिप्ट के रूप में, जब फ़ाइलों का उपयोग करने वाली निर्देशिका में लॉन्च किया जाए:
#!/bin/bash
for f in ./*
do
if [[ -f "$f" ]]; then
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
else
echo "$f is not a file, skipping."
fi
done
या आप एक ही काम करने के लिए इस बहुत लंबे बदसूरत आदेश का उपयोग कर सकते हैं:
for f in ./* ; do if [[ -f "$f" ]]; then file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; else echo "$f is not a file, skipping."; fi; done
सभी भागों की व्याख्या करने के लिए:
for f in ./*
वर्तमान निर्देशिका में हर चीज के लिए साधन, यह करें .... यह प्रत्येक फ़ाइल या निर्देशिका को चर $ f के रूप में मिला है।
if [[ -f "$f" ]]
जाँचता है कि क्या आइटम पाया गया फ़ाइल है, यदि हम उस echo "$f is not...
हिस्से पर नहीं जाते हैं, जिसका अर्थ है कि हम निर्देशिकाओं को गलती से हटाना शुरू नहीं करते हैं।
file="${f%.*}"
फ़ाइल नाम ट्रिमिंग के रूप में $ फ़ाइल चर सेट करता है जो अंतिम के बाद आता है .
।
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
वह जगह है जहां मुख्य अंकगणित अंदर किक करता है। विस्तार के बिना हमारे फाइलनाम में ${file##*.}
अंतिम से पहले सब कुछ ट्रिम करता है .
। $(( $num % $num2 ))
बैश अंकगणितीय के लिए modulo ऑपरेशन का उपयोग करने के लिए वाक्यविन्यास है, 10#
शुरुआत में Bash को आधार 10 का उपयोग करने के लिए कहता है, उन pesky प्रमुख 0s से निपटने के लिए। $((10#${file##*.} % 12))
फिर हमें हमारे शेष फ़ाइल नाम संख्याओं को 12 से विभाजित -ne 0
करता है। चेक करता है कि शेष शून्य के बराबर नहीं है।
- शेष 0 के बराबर नहीं है, तो फ़ाइल के साथ हटा दिया जाता है
rm
आदेश, आप को बदलने के लिए चाहते हो सकता है rm
के साथ echo
जब पहली बार इस चल रहा है, जिसे आप हटाना उम्मीद फ़ाइलें प्राप्त की जाँच करने के।
यह समाधान गैर-पुनरावर्ती है, जिसका अर्थ है कि यह केवल वर्तमान निर्देशिका में फ़ाइलों को संसाधित करेगा, यह किसी भी उप-निर्देशिका में नहीं जाएगा।
if
साथ बयान echo
आदेश निर्देशिका के बारे में चेतावनी देने के लिए वास्तव में आवश्यक के रूप में नहीं है rm
पर यह खुद है निर्देशिकाओं के बारे में शिकायत करेंगे, और न उन्हें हटा दें, तो:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
या
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
सही ढंग से काम भी करेगा।