ডিরেক্টরিতে সমস্ত ফাইলের নাম (তাদের নতুন নাম) থেকে 1 টি বিয়োগ করুন।


17

আমার একটি ডিরেক্টরি রয়েছে যাতে নামগুলির মতো চিত্র ফাইল রয়েছে contains

image1.jpg 
image2.jpg 
image3.jpg
...

দুর্ভাগ্যবশত, ইমেজ নাম শূন্য ভিত্তিক হতে হবে, তাই image1.jpgহওয়া উচিত image0.jpg, image2.jpgহওয়া উচিত image1.jpgইত্যাদি।

আমি এগুলির মতো এমভি কমান্ড তৈরি করতে একটি স্ক্রিপ্ট লিখতে পারি , সেগুলি শেল স্ক্রিপ্টে রাখতে পারি এবং তারপরে এগুলি কার্যকর করতে পারি -

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...

তবে আমি অনুমান করি ইউনিক্সে এটি করার একটি সুস্পষ্ট উপায় আছে। তো এটা কি?


6
যতক্ষণ না কোনও ফাঁক রয়েছে ততক্ষণ এটি এটি করার সহজতম উপায়। ( for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done)
রিকি বিম

5
ছবির ক্রম কি গুরুত্বপূর্ণ? যদি না হয়, শুধু গত ইমেজ নামান্তর imageN.jpgকরতে image0.jpgএবং আপনার কাজ সম্পন্ন করা হয়।
jnovacho

@ জ্নোভাচো, বেশ চালাক! তবে হ্যাঁ, চিত্রগুলির ক্রমটি গুরুত্বপূর্ণ।
ওয়েজ

উত্তর:


20

ভাল পুরানো পার্ল নামকরণ:

rename 's/(\d+)(\.jpg)/($1-1).$2/e' *

[মন্তব্য]

চিত্র সংখ্যা 0 এর চেয়ে বেশি হওয়া উচিত।

যদি চিত্রগুলি 9 এর চেয়ে বেশি হয় এবং 0 টির বেশি নেতৃত্ব না দেয় তবে $(ls -v1 *)ক্লোবার্বিং এড়াতে ব্যবহার করুন । @ অ্যারিলফ দ্বারা প্রস্তাবিত এবং @ গ্র্যাম দ্বারা লক্ষ্য করা গেছে।

সন্দেহ হলে -vভারবোস এবং অ -n-অ্যাকশনের জন্যও ব্যবহার করুন ।


"ই" কি বোঝায়?
ওয়েজ

3
'ই' অর্থ মূল্যায়ন করা, প্রতিস্থাপন বিভাগটি মূল্যায়ন করা হবে। এছাড়াও দেখুনperlreref

6
কোনও ক্লোবার এড়ানোর জন্য ফাইলগুলি আরোহণের ক্রমে পাস করতে হবে। এটি কেবলমাত্র 10 টিরও কম ফাইল (বা সংখ্যার শীর্ষস্থানীয় শূন্য থাকলে) কাজ করবে।
গ্রিম

আমি এটি ইতিমধ্যে লক্ষ্য করেছি, 0উত্সগুলিতে অবশ্যই একটি হওয়া উচিত নয় ।

2
প্রতিস্থাপন *সঙ্গে শেষে `ls -v1 *`এবং আপনার clobbering থেকে নিরাপদ থাকব। এটি সর্বনিম্ন সংখ্যা থেকে সর্বোচ্চে চলে যাবে।
আরিফেল

6

আপনি উত্পন্ন mvআদেশগুলি পাইপ করতে পারেন bash। সুতরাং আপনাকে এগুলি কোনও স্ক্রিপ্টে অনুলিপি করতে হবে এবং এটি চালানো হবে না। দেখা:

command_that_generates_mv_commands | bash

এবং সমস্ত কার্যকর করা হবে যা পাইপ করা হয়েছে bash


তা আরও সুন্দর নয়। :)সমস্যাটি যদিও সমাধান করে, তাই +1।
জেএমসিএফ 125

5

আপনি এলএস আউটপুটটিতে পুনরাবৃত্তি করতে পারেন, এটি আপনার উদাহরণের জন্য কাজ করে:

i=0 
for file in $(ls *.jpg | sort) ; do 
     mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
     i=$((++i))
done

আপনাকে অবশ্যই আপনার ফাইলগুলির একই পথে থাকতে হবে


1
ব্যবহার করা -iবা এর -nসাথে আরও ভাল mv, এটি প্রান্তের ক্ষেত্রে ওভাররাইটিং প্রতিরোধ করবে।
গ্রামীণ

sort -Vপরিবর্তে ভাল হবে না ?
ব্যবহারকারী 80551

sortকাজ করবে না, এটি কোনও সমস্যা হতে পারে তার image10.jpgআগে এটি প্রদর্শিত হবে image1.jpgsort -nk 1.8@ গ্রেমের উত্তর হিসাবে আপনার প্রয়োজন ।
টেরডন

@ ব্যবহারকারী ৮৮৫৫১, sort -Vএটি একটি ভাল ধারণা, এটি আমার উত্তরে যুক্ত করবে। অন্য প্রান্তের কেসগুলিও থাকতে পারে, কেবল কোনও ব্যক্তি অনুলিপি করে এবং কিছু ক্ষতি করে শেষ করলে এই ধরণের প্রশ্নগুলির সাথে এই ধরণের বিকল্পগুলি যুক্ত করার জন্য সাধারণত ভাল পরামর্শ।
গ্রীম

4

নীচে প্যাটার্ন ফিট করে এমন কোনও কিছুর জন্য কাজ করতে দেখা যাচ্ছে imageNUMBER.jpg। কমান্ডের echoআগে আমি mvকমান্ডের সামনে রেখে দিয়েছি যে কমান্ডটি কি করবে; আসলে নাম পরিবর্তন করতে, শুধু মুছে ফেলুনecho

for i in `ls image*.jpg|sort -V` ; do 
    x=`echo $i|sed -e "s/image\(.*\).jpg/\1/"`
    y=$(( $x - 1 ))
    echo mv -i $i image$y.jpg
done

প্রথম লাইনে, ls image*.jpg|sort -Vজে.পি.জি. ফাইলগুলি ফাইলের নাম হিসাবে আরোহণের সংখ্যার সাথে তালিকাবদ্ধ করবে। x=লাইন ফাইলের নাম থেকে সংখ্যা চায়ের। y=লাইন তারপর একের পর সংখ্যা decrements। ইনপুট ফাইলের নাম এবং yনম্বরটি mvকমান্ডটিতে ব্যবহার করা -iহবে , যেখানে পতাকাটি কোনও ফাইল ওভাররাইট করার আগে আপনাকে অবহিত করবে।

আমার নিজের ছোট পরীক্ষার জন্য, এটি আউটপুট তৈরি করেছে:

mv -i image1.jpg image0.jpg
mv -i image2.jpg image1.jpg
mv -i image123.jpg image122.jpg

ব্যক্তিগতভাবে, আমি আরও একটি আলাদা ফাইলের নাম পরিবর্তন করার পরামর্শ দেব, যেহেতু এখন ফাইলগুলি যে ক্রমে প্রক্রিয়া করা হচ্ছে তাতে একটি বড় পার্থক্য আসতে পারে।


1
ব্যবহার করা -iবা এর -nসাথে আরও ভাল mv, এটি প্রান্তের ক্ষেত্রে ওভাররাইটিং প্রতিরোধ করবে।
গ্রামীণ

খুব ভাল পরামর্শ, আমি উত্তর সম্পাদনা করব
brm

ম্যাকোজে আপনার ব্যবহার করা উচিত sort -n, -Vবিকল্পটি বিদ্যমান নেই।
ভিনসেন্ট

4

perlস্ক্রিপ্টটি ব্যবহার করুন prename, যা দেবিয়ান ভিত্তিক ডিস্ট্রোজে পুনরায় নামকরণের জন্য অনুরূপ, এছাড়াও জিএনইউ find/ প্রয়োজন sort। কোনও ওভাররাইটিং রোধ করতে ফাইলগুলি আরোহী ক্রমে রাখা হয়।

find . -regex '\./image[0-9]+\.jpg' -print0 | sort -zV |
  xargs -0 rename -n 's/(\d+)\.jpg$/@{[$1-1]}.jpg/'

-nএকবার আপনি যখন যা নিশ্চিত হন তা সরিয়ে ফেলুন । এমন করার আগেই বিদ্যমান ফাইল সম্পর্কে সতর্ক করবে। তবে যতক্ষণ না এটি দেখায় যে ফাইলগুলির নামটি আরোহণের ক্রমে করা হচ্ছে, বাস্তবের জন্য চালানোর সময় কোনও বিরোধ হবে না।


ফাইলটি ইতিমধ্যে এটিতে সমস্যা রয়েছে।
ওয়েজ

4

সাথে zsh:

autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'

( -nখুশি হলে অপসারণ )।

(n)তালিকাটিকে সংখ্যা অনুসারে বাছাই করা হয় তাই image9.jpgপূর্বে নামকরণ করা হয় image10.jpg

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