একই সাথে একটি ডিরেক্টরিতে একাধিক ফাইলের নাম কীভাবে রাখা যায়


12

আমার ডিরেক্টরিতে আছে /var/tmp/abcযাতে 4 টি ফাইল রয়েছে:

12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv

আমি সংক্ষিপ্ততম (সম্ভবত ওয়ান-লাইনার) উপায়টিতে সমস্ত সিএসভি ফাইল (সমস্ত ফাইল সন্ধান করুন এবং তাদের নাম পরিবর্তন করুন) এর নাম পরিবর্তন করতে চাই:

XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

উত্তর:


15

rename -n 's/(\w+)/XXXXX/' *.csv

-nখুশী যখন অপসারণ ।


2
এর উপযুক্ত সংস্করণের জন্য rename। আমি ধরে নিয়েছি যে এটি ল্যারি ওয়াল এর rename, renameডেবিয়ান এবং ডেরাইভেটিভের প্যাকেজ থেকে (এবং prenameরেডহ্যাট অনুগ্রহ করার সিস্টেমগুলিতে আইআইআরসি )। একটি খুব দরকারী সরঞ্জাম।
xenoid

2
perl-renameখিলান লিনাক্সে
লেসমানা

1
@ শাওয়ার্ডন, আমি কমান্ডটি সম্পাদন করার চেষ্টা করেছি এবং প্রতিস্থাপনের প্যাটার্নটি বোঝার জন্য ম্যান পৃষ্ঠার প্রাসঙ্গিক অংশটি পড়তে চেষ্টা করেছি, তবে verboseপতাকাটি যুক্ত করার পরে এটি কিছুতেই আউটপুট দেয় এবং ফাইলের নাম পরিবর্তন করে না, যদিও বর্তমান পথ রয়েছে নামের মতো ফাইল 12345_foo.csv। এটি কাজ করার জন্য আমার কি অতিরিক্ত কোনও কাজ সম্পাদন করতে হবে (বর্তমানে ফেডোরার 30 তে)? এটি লুপিংয়ের চেয়ে পরিচ্ছন্ন পদ্ধতির approach আগাম ধন্যবাদ!
ড্যানিয়েলডিপলপার 1001

3
@ danieldeveloper001 আপনি ব্যবহার করেছেন renameনাকি prename? আমার মন্তব্য উপরে দেখুন। man {the command}শেষে লেখকদের তালিকাভুক্ত করে।
xenoid

2
এটি কেবলমাত্র দেবিয়ান থেকে প্রাপ্ত সিস্টেমগুলিতে কাজ করে। ফেডোরা-প্রাপ্ত সিস্টেমগুলিতে সম্পূর্ণ আলাদা renameকমান্ড রয়েছে; দেখতে unix.stackexchange.com/a/238862/135943
ওয়াইল্ডকার্ড

11

চেষ্টা করুন:

for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done

কিভাবে এটা কাজ করে:

  • for f in *.csv; do

    এটি সমস্ত *.csvফাইলের উপর একটি লুপ শুরু করে।

  • mv -i -- "$f" "XXXXX-${f#*-}"

    এটি যে কোনও ফাইলকে ওভাররাইট করার আগে ইন্টারেক্টিভভাবে জিজ্ঞাসা করে, ফাইলগুলি নিজের ইচ্ছামত পুনরায় নামকরণ করে।

  • done

    এটি লুপটির শেষে চিহ্নিত করে।

উদাহরণ:

$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

4

আপনার পোস্ট করা সামান্য চ্যালেঞ্জটি আমি পছন্দ করেছি, সুতরাং আমার সমাধান এখানে। আমি ধরে নিচ্ছি যে আপনার সমস্ত ফাইল 5 টি সংখ্যার অক্ষর দিয়ে শুরু হয়, তাই প্রাথমিক সংখ্যাটি ফাইলগুলি "XXXXX" দ্বারা প্রতিস্থাপন করতে কাট কমান্ডটি ব্যবহার করে ।

কমান্ডের আগে ফাইলগুলি নীচে।

-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml

নীচে, ওয়ান লাইনার কমান্ড।

for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;

নীচে, কমান্ডের পরে ফাইলগুলি।

-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv

আপনি কি এটি খুঁজছেন? :)

তথ্যসূত্র:

বাশে কমান্ড আউটপুট মাধ্যমে লুপিং

ব্যাশে সাবস্ট্রিংস


2
বাশ এই ধরণের স্ট্রিং ম্যানিপুলেশন করতে পারে, প্রত্যেকের জন্য একটি নতুন প্রক্রিয়া তৈরি করার দরকার নেই, দয়া করে কীভাবে অন্য উত্তরটি দিন
chx

1
@ সিএইচএক্স, ইতিমধ্যে অন্যান্য উত্তরগুলি দেখেছে এবং এ থেকে কিছুটা জ্ঞান অর্জন করেছে, তবে সেগুলি উল্লেখ করার জন্য ধন্যবাদ। আপনি দয়া করে বিস্তারিত বলতে হবে no need to fork a new process for each?
danieldeveloper001

3
cutএকটি পৃথক বাইনারি ( /usr/bin/cut) এবং এটি চালানো শেল বিল্ট ইনগুলি ব্যবহার করার চেয়ে বেশি সংস্থান গ্রহণ করে।
chx

2
আমি দেখছি, অভিপ্রায়টি যদি অনেকগুলি ফাইলের নাম পরিবর্তন করে তবে এটি আসলে গুরুত্বপূর্ণ। সুস্পষ্ট করার জন্য ধন্যবাদ!
ড্যানিয়েলডিপলপার 1001

1

কোন কাঁটাচামচ:

ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'

আপনি যদি একটি শেল লুপ, ব্যবহার করেন, তখন mvফাইল প্রতি একবার কাটাচামচ। পার্লের renameকমান্ড দেয় না।

(পার্লের নাম পরিবর্তনের আদেশে কিছু বিধিনিষেধ রয়েছে, তবে এই নির্দিষ্ট ক্ষেত্রে সেই বিধিনিষেধগুলি প্রযোজ্য নয়))

হিসাবে renameকমান্ড আগের দেখানো হ্যাঁ যে কাজ, কিন্তু তারপর আপনি তাই পুনঃনামকরণ দু ধরণের মধ্যে যে সব বিভ্রান্তি আছে। আপনার যদি সঠিক থাকে তবে দুর্দান্ত, তবে তা না হলে এটিও কার্যকর।

আপনার যদি পার্ল-নাম পরিবর্তনের কমান্ড না থাকে এবং এটি ইনস্টল করতে না পারেন তবে আপনি কেবল এটি করতে পারেন:

ls | perl -lne '$old=$_; s/(\w+)/XXXXX/; rename $old, $_'

আপনি দেখতে পাচ্ছেন, এটি শীর্ষ উত্তরে প্রদর্শিত একই প্রতিস্থাপন ব্যবহার করে। অবশ্যই Perl-পুনঃনামকরণ অন্যান্য ঘন্টাধ্বনি এবং whistles (শীর্ষ উত্তর উল্লেখ করা হয়েছে, হয়েছে -nইতিমধ্যে, তারপর আছে -0, -f, ইত্যাদি), এবং তাদের আরও প্রয়োজন, আরো আপনি আপনার নিজের এই পদ্ধতিতে ইনস্টল করা উচিত পরিবর্তে ঘূর্ণায়মান ।


পাইপের স্বাভাবিক প্রয়োগগুলির কাঁটাচামচ থাকবে have
মুরু

আমি বোঝাতে চাইছি, "প্রতি ফাইলের নামকরণের জন্য একবার ফাইলের কাঁটাচামচ করা হবে না", এমনকি শেল থেকে পৃথক, যেখানে "এমভি" কাঁটাচামচ করে / usr / bin / mv বা যাই হোক না কেন। কারণ "পুনরায় নামকরণ" কমান্ডটি পার্ল অভ্যন্তরীণ কমান্ড যা সরাসরি libc এ পুনর্নবীকরণ () নামে ডাকে। অবশ্যই এটির কিছু বিধিনিষেধ রয়েছে তবে এই নির্দিষ্ট উদাহরণে এই বিধিনিষেধগুলি প্রযোজ্য নয়।
सितারাম

1
এটি renameকমান্ডটিরও সত্য ( শীর্ষ উত্তরটিও পার্ল ব্যবহার করে), সুতরাং সম্ভবত উত্তরের জন্য কেবল "নো কাঁটাচামচ" না করে আপনার আরও কিছুটা ব্যাখ্যা যুক্ত করা উচিত।
মুড়ু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.