আপনার স্ক্রিপ্টে বিভিন্ন সম্ভাব্য ব্যর্থতা পয়েন্ট রয়েছে। প্রথমত, সমস্ত মিলে যাওয়া ফাইলগুলির একটি তালিকা তৈরি 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 বা ততোধিক অক্ষর" ( *
) এর সাথে মিলে যায়, তারপরে ক .
, তারপরে "পুরাতন", তার পরে অন্যটি .
এবং "আবার 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
লক্ষ্য করুন আমি যোগ -v
করতে rm
এবং CP which does the same thing as what you were doing with your
echo` বিবৃতি।
এটি নিখুঁত নয় যেহেতু আপনি যখন খুঁজে পাবেন, উদাহরণস্বরূপ, file.old
এটি মুছে ফেলা হবে এবং পরে, স্ক্রিপ্টটি এটি অনুলিপি করার চেষ্টা করবে এবং ফাইলটি আর বিদ্যমান না থাকায় ব্যর্থ হবে। তবে আপনি যা স্ক্রিপ্টটি আসলে করার চেষ্টা করছেন তা আপনি ব্যাখ্যা করেন নি তাই আপনি যদি সত্যিই কী অর্জন করার চেষ্টা করছেন আপনি আমাদের না জানান তবে আমি আপনার জন্য এটি ঠিক করতে পারছি না।
যদি আপনি যা চান তা i) .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.*
সেগুলি এই ফাইলগুলি সরিয়ে দেয় তবে ফাইল.ল্ড ব্যাকআপ ফাইল নয়। আমি আমার স্ক্রিপ্টে তা করার চেষ্টা করছি। ধন্যবাদ