শেল স্ক্রিপ্ট ব্যবহার করে লিনাক্সের আন্ডারস্কোর সহ সমস্ত ফাইলের নামের ফাঁকা স্থান পরিবর্তন করবেন কীভাবে?


17

আমি শেল স্ক্রিপ্টটি অনুসরণ করার চেষ্টা করেছি যা সমস্ত এক্সএমএল ফাইলের নাম থেকে ফাঁকা স্থান প্রতিস্থাপন করা উচিত

for xml_file in $(find $1 -name "* .xml" -type f);
do
 echo "removing spaces from XML file:" $xml_file
 mv "$xml_file" "${xml_file// /_}";
done

মনে করুন, নামটি সহ আমার কাছে এক্সএমএল ফাইল রয়েছে xy z.xml, তবে এটি দেয়:

removing spaces from XML file: /home/krishna/test/xy
mv: cannot stat `/home/krishna/test/xy': No such file or directory
removing spaces from XML file: .xml
mv: cannot stat `z.xml': No such file or directory

উত্তর:


29

এটি দিয়ে ব্যবহার করুন bash:

find $1 -name "* *.xml" -type f -print0 | \
  while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done

findনামে একটি স্থান সহ ফাইলগুলি অনুসন্ধান করবে। ফাইলের নামগুলি একটি নলবাইট ( -print0) দিয়ে ডিলিমিটার হিসাবে মুদ্রিত করা হবে যাতে বিশেষ ফাইলের নামগুলিও মোকাবেলা করতে পারে। তারপরে readবিল্টিন নলবাইটের দ্বারা সীমাবদ্ধ ফাইলের নামগুলি পড়ে এবং শেষ পর্যন্ত mvস্পেসগুলি একটি আন্ডারস্কোর দিয়ে প্রতিস্থাপন করে।

সম্পাদনা: আপনি যদি ডিরেক্টরিতেও ফাঁকা স্থান সরিয়ে নিতে চান তবে এটি কিছুটা জটিল। ডিরেক্টরিগুলি পুনরায় নামকরণ করা হয় এবং নামটির পরে আর অ্যাক্সেসযোগ্য হয় না find। এটা চেষ্টা কর:

find -name "* *" -print0 | sort -rz | \
  while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done

sort -rzফাইল অর্ডার reverses, যাতে ফোল্ডারে গভীরতম ফাইল প্রথম স্থানান্তর করতে এবং ফোল্ডার নিজেই গত এক হতে হবে। সুতরাং, সমস্ত ফাইল এবং ফোল্ডারটির অভ্যন্তরে পুনরায় নামকরণের আগে কোনও ফোল্ডার পুনরায় নামকরণ করা হবে না। mvলুপ কমান্ড একটি বিট খুব পরিবর্তিত হয়। টার্গেট নামে আমরা কেবল ফাইলের বেসনামে থাকা স্পেসগুলি সরিয়ে ফেলি, অন্যথায় এটি অ্যাক্সেসযোগ্য হবে না।


আমি সমস্ত ডিরেক্টরিতে আন্ডারস্কোর দিয়ে স্পেসগুলি প্রতিস্থাপনের চেষ্টা করছি তবে এটি ত্রুটি দিচ্ছে কারণ নাম পরিবর্তন করার পরে ডিরেক্টরিটি অ্যাক্সেসযোগ্য নয়।
কৃষ্ণ

@ কৃষ্ণ আমি আমার উত্তরে একটি সম্পাদনা যুক্ত করেছি।
বিশৃঙ্খলা

1
@ চাওস ওয়াও, কেবল দুটি সিস্টেমে এই দুটি চালিয়েছেন এবং এটি একটি কবজির মতো কাজ করেছে, কয়েকটি ফাইল এবং ডায়ারগুলি যাচ্ছেন না তবে এটি কেবল কয়েকটি
কিছু

ম্যাকোস-তে আমাদের-নাম বিকল্পের আগে ফাইন্ড কমান্ডে ডিরেক্টরিটি নির্দিষ্ট করতে হবে find . -name "* *" -print0 | sort -rz | \ while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
লাস্লো পিন্টার

17
  1. ব্যবহার rename

    find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;

    বা সাথে $1

    find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
  2. ব্যবহার mv

    find . -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;

    বা সাথে $1

    find "$1" -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;

আমি জানি না কেন তবে আপনার প্রদত্ত আদেশটি আমার পক্ষে কাজ করছে না। এটি কোনও ত্রুটি এবং আউটপুট দেখাচ্ছে না।
কৃষ্ণ

@ কৃষ্ণ সংশোধন করেছেন, দুঃখিত
এবি

1
পুনর্নাম আমার পক্ষে কাজ করেছিল। Fistbump!
ব্রায়ান পিয়ারসি

1

একই সমস্যার মুখোমুখি হওয়ার সময় এটি আমি খুঁজে পেয়েছি:

for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done

আমি আমার এসএসএল শংসাপত্রগুলি স্বয়ংক্রিয়ভাবে আপডেট করতে বাশ স্ক্রিপ্ট ফাইল লিখছিলাম।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.