आपकी स्क्रिप्ट में विभिन्न संभावित विफलता बिंदु हैं। सबसे पहले, सभी मिलान फ़ाइलों की एक सूची बनाने के rm *.old*
लिए ग्लोबिंग का उपयोग करेंगे , और जो व्हॉट्सएप युक्त फ़ाइल नामों से निपट सकते हैं। हालाँकि, आपकी स्क्रिप्ट ग्लोब के प्रत्येक परिणाम के लिए एक वैरिएबल प्रदान करती है और वह भी बिना उद्धरण के। अगर आपकी फ़ाइल के नाम में व्हॉट्सएप है तो वह टूट जाएगा। उदाहरण के लिए:
$ ls
'file name with spaces.old.txt' file.old.txt
$ rm *.old.* ## works: both files are deleted
$ touch "file.old.txt" "file name with spaces.old.txt"
$ for i in ./*; do oldfile=$i; rm -v $oldfile; done
rm: cannot remove './file': No such file or directory
rm: cannot remove 'name': No such file or directory
rm: cannot remove 'with': No such file or directory
rm: cannot remove 'spaces.old.txt': No such file or directory
removed './file.old.txt'
जैसा कि आप देख सकते हैं, लूप अपने नाम के रिक्त स्थान वाली फ़ाइल के लिए विफल हो गया। इसे सही ढंग से करने के लिए, आपको चर को उद्धृत करना होगा:
$ for i in ./*; do oldfile="$i"; rm -v "$oldfile"; done
removed './file name with spaces.old.txt'
removed './file.old.txt'
$i
आपकी स्क्रिप्ट के हर उपयोग पर एक ही समस्या लागू होती है । आपको हमेशा अपने चर को उद्धृत करना चाहिए ।
अगला संभावित मुद्दा यह है कि आप उम्मीद करते हैं कि *.old.*
एक्सटेंशन के साथ फाइल मेल खाती है .old
। यह नहीं है यह "0 या अधिक वर्ण" ( *
), फिर a .
, फिर "पुराना", फिर दूसरा .
और फिर "0 या अधिक वर्ण" से मेल खाता है । इसका मतलब यह है कि यह किसी चीज़ से मेल नहीं खाएगा file.old
, लेकिन केवल `file.old.foo की तरह कुछ:
$ ls
file.old file.old.foo
$ for i in *; do if [[ "$i" == *.old.* ]]; then echo $i; fi; done
file.old.foo
तो, कोई मुकाबला नहीं दुश्मन file.old
। किसी भी मामले में, आपकी स्क्रिप्ट ज़रूरत से ज़्यादा जटिल है। इसके बजाय यह प्रयास करें:
#!/bin/bash
for i in *; do
if [[ -f "$i" ]]; then
if [[ "$i" == *.old ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i doesn't have an .old extension"
fi
cp -v "$i" "$i".old
else
echo "$i is not a file"
fi
done
ध्यान दें कि मैंने cp echo` स्टेटमेंट्स में जोड़ा -v
है ।rm
which does the same thing as what you were doing with your
यह तब से परिपूर्ण नहीं है जब आप पाते हैं, उदाहरण के लिए, file.old
जिसे हटा दिया जाएगा और, बाद में, स्क्रिप्ट इसे कॉपी करने की कोशिश करेगी और विफल हो जाएगी क्योंकि फ़ाइल अब मौजूद नहीं है। हालाँकि, आपने यह नहीं बताया कि आप वास्तव में क्या स्क्रिप्ट का प्रयास कर रहे हैं, इसलिए मैं आपके लिए यह तय नहीं कर सकता कि जब तक आप हमें यह न बताएं कि आप वास्तव में क्या हासिल करना चाहते हैं।
यदि आप चाहते हैं कि मैं) .old
एक्सटेंशन वाली सभी फ़ाइलों को हटा दूं और ii) .old
किसी भी मौजूदा फाइल में एक्सटेंशन जोड़ें, जो आपके पास नहीं है, तो आपको वास्तव में इसकी आवश्यकता है:
#!/bin/bash
for i in *.old; do
if [[ -f "$i" ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i is not a file"
fi
done
## All the ,old files have been removed at this point
## copy the rest
for i in *; do
if [[ -f "$i" ]]; then
## the -v makes cp report copied files
cp -v "$i" "$i".old
fi
done
rm *.old.*
करता हूं जो इन फ़ाइलों को हटा देती है। लेकिन file.old बैकअप फ़ाइल नहीं। मैं अपनी स्क्रिप्ट में ऐसा करने की कोशिश कर रहा हूं। धन्यवाद