ফাইলগুলির নাম পরিবর্তন করার সময় স্থানগুলি প্রতিস্থাপন করা এড়িয়ে চলুন


10

আমি এই জাতীয় ফাইলগুলির নাম পরিবর্তন করার চেষ্টা করছি:

for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done

কিন্তু sedকমান্ড দিয়ে সমস্ত স্পেস প্রতিস্থাপন _

sedসুনির্দিষ্ট অক্ষরগুলির সাথে এটি কীভাবে ফাঁকা স্থান তৈরি করতে আমি আদেশটি সম্পাদনা করতে পারি ? আমি চেষ্টা করার চেষ্টা করেছি \sকিন্তু এটি কাজ করে না ...

সম্পাদনা:
উদাহরণস্বরূপ: ফাইলটির trip: hillনাম পরিবর্তন করা উচিত: trip_ hillতবে উপরের কমান্ডটি এটি তৈরি করে trip__hill


আমি লিনাক্স থেকে ম্যাকে কিছু ফাইল সরিয়ে নিচ্ছি। তবে কিছু কারণে ম্যাক সিস্টেম সমস্ত ফাইলের নাম পড়তে পারে না, তাই আমি আমার ফাইলগুলির নাম পরিবর্তন করার চেষ্টা করছি। উপরের কমান্ডে একটি স্থান যুক্ত করা কার্যকর নয়। এবং আপনি সঠিক: আমি বর্ণগুলি বাদ দিয়ে সমস্ত অক্ষর '_' দিয়ে প্রতিস্থাপন করতে চাই। এবং আমি জানি না কীভাবে স্থানের চরটি অন্তর্ভুক্ত করা যায়।

অনুগ্রহ করে নোট করুন যে আমি নির্দিষ্ট বর্ণ ব্যতীত সমস্ত অক্ষর '_' দিয়ে প্রতিস্থাপন করার চেষ্টা করছি। নতুন নামকরণ করা ফাইলগুলির কোনও নির্দিষ্ট প্যাটার্ন নেই, তাই আমি এই পার্ল কমান্ডটি ব্যবহার করতে পারি না।

উত্তর:


11

ফাইলের সাথে পার্স করবেন না sed! এর আউটপুট echo "$file"নির্ভরযোগ্য নাও হতে পারে।

ব্যবহার rename। 17.10 এ আপনাকে প্রথমে এটি ইনস্টল করতে হবে

sudo apt install rename

তারপর:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *

মন্তব্য

  • -nআসলে ফাইলগুলির নাম পরিবর্তন করতে পরীক্ষার পরে অপসারণ করুন
  • -- কোনও ফাইল দিয়ে শুরু হওয়ার সাথে সাথে বিকল্পগুলির বিকল্প -
  • [^-A-Za-z0-9_ .]যে অক্ষরগুলি আমরা প্রতিস্থাপন করতে চাই না - -প্রথমে বা শেষ রাখি যাতে এটি কোনও পরিসীমা নির্দেশ করতে পারে না (এটি এই অবস্থানগুলিতে আক্ষরিক অর্থে বিবেচনা করা হয়)।
  • স্পেস ক্লাসে অন্তর্ভুক্ত করা যেতে পারে
  • . আক্ষরিকভাবে চিকিত্সা করা হয় (অন্যান্য রেজেক্স প্রসঙ্গে এটি কোনও চরিত্রের জন্য দাঁড়িয়ে এবং এড়াতে হবে)।

এটি এতে কাজ করে sed:

$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill

আমি যদি আপনার সংস্করণে শেষ পর্যন্ত একটি স্থান যুক্ত করি তবে আমি একটি ত্রুটি পেয়েছি:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end

তবে -শেষে, এটি কাজ করে:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill

আপনি সম্ভবত স্থান যুক্ত করার পরে সম্ভবত হাইফেনের অবস্থানটি আপনার সমস্যার কারণ হতে পারে। কিন্তু ফাইল নাম পার্স না করার পরামর্শই দাঁড়িয়ে!


এই আদেশ কাজ করে আপনাকে ধন্যবাদ। আমি যে কমান্ডটি ব্যবহার করেছি তাতে আপনি ভুলগুলিও পরিষ্কারভাবে চিহ্নিত করেছেন।

2
আবার আপনাকে ধন্যবাদ. দয়া করে মনে রাখবেন যে সেড ব্যবহারের ক্ষেত্রে ফরওয়ার্ড স্ল্যাশ '\' ব্যবহার করার দরকার নেই। কারণ এটি উপেক্ষা করা অক্ষরের তালিকায় '\' যুক্ত করে।

2
@ এলতাচ এটি ব্যাকস্ল্যাশ, তবে আপনি একেবারে ঠিক। চারপাশে পরীক্ষা এবং খননের পরে আমি দেখতে পেলাম যে .এটি একটি অক্ষর শ্রেণিতে আক্ষরিক। তিল!
জান্না

2

আপনি কেবল শেলটিও ব্যবহার করতে পারেন, বাশের প্যারামিটার সম্প্রসারণ প্রতিস্থাপন করতে পারে:

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

ডাবল স্ল্যাশ এটিকে সমস্ত ম্যাচ প্রতিস্থাপন করতে বলে, তার বাইরে বাক্য গঠনটি সোজা।

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