এক্সটেনশনের আগে ফাইলের নামটিতে পাঠ্য যুক্ত করা হচ্ছে


25

আমি ফাইল নামের শেষে পাঠ্য যুক্ত করতে চাই তবে এক্সটেনশনের আগে। এখনই আমি চেষ্টা করছি,

for f in *.shp; do echo $f_poly; done

আউটপুট হয়,

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

আমি এটি হতে চাই,

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

উত্তর:


27

স্ট্যান্ডার্ড POSIX পরামিতি প্রসারণ ব্যবহার :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

দুর্দান্ত যে আমার প্রয়োজন ছিল ঠিক তাই।
Sam007

1
এটি কীভাবে কাজ করে তার ব্যাখ্যা দিয়ে আরও ভাল হতে পারে। অন্যদিকে ডগ উত্তরটি বেশ সহজ।
সার্জে বোর্শ

নিবন্ধন করুন আমার উত্তর, প্রশ্নের স্নিপেট এবং ডগের উত্তর কেবল কয়েকটি চরিত্রের দ্বারা পৃথক, এবং ডগের উত্তর আমার চেয়েও কম ব্যাখ্যা করে তাই আপনি কী চান তা আমি জানি না। যদি আপনি প্রশ্নের দুটি আউটপুটগুলির মধ্যে পার্থক্যটি কেবলমাত্র তুলনা করেন তবে তারা কী করেন তা নির্ধারণ করা তুচ্ছভাবে সহজ হওয়া উচিত। আমার উত্তর কেন ডগের চেয়ে পছন্দীয় তা আমি ব্যাখ্যা করতে পারি। 1. আমি printfকম পোর্টেবলের পরিবর্তে ফর্ম্যাট স্ট্রিং ব্যবহার করি echo। ২. আমি প্যারামিটার সম্প্রসারণটি ব্যবহার করি যা এ basenameজাতীয় সাধারণ কাজের জন্য কোনও বাহ্যিক বাইনারি ( ) কল করার চেয়ে কার্যকর ।
jw013

তারপরে ফাইলগুলির নামকরণের আদেশটি for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
হ'ল

6

কখনও কখনও "পুনরায় নামকরণ" নামে একটি সরঞ্জাম ইনস্টল করা থাকে।

rename 's/\.shp$/_poly.shp/' *shp

এটি পোর্টেবল নাও হতে পারে তবে এটি ব্যবহার করা সহজ।


1
এই একমাত্র আমার পক্ষে কাজ করেছে, দুর্দান্ত উত্তর!
wanderer0810

4

এটা ব্যবহার কর:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
ব্যবহার basenameধীর এবং কম লেট শেল নিজে কাজ চেয়ে কার্যকরী। এটি খুব বড় সংখ্যক ফাইলের জন্য লক্ষণীয় হতে পারে।
jw013

এছাড়াও, এখানে উদ্ধৃতি এবং --গুলি নেই এবং এটি ফাইলের জন্য ব্যর্থ হয় যা এর আগে নিউলাইন অক্ষর রয়েছে .shp
স্টাফেন চেজেলাস

একটি উত্তর দেওয়ার জন্য ধন্যবাদ আমি আসলে আমার উদ্দেশ্য নিয়ে কাজ করতে পারি। এটি বাশ সহায়তা, কোড গল্ফ নয়। (এই উপর পড়া .. আমি বুঝতে পারছি এটা ধুত হতে পারে মত আমি ব্যঙ্গাত্মক হচ্ছিলাম পুলিশের চেয়ে এখানে অন্যান্য উত্তর সম্পর্কে আরো gripping ধন্যবাদ আবার।।)
টিম

3

এটি আমার পক্ষে আরও ভাল কাজ করেছে:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


এইটি দেখতে অনেকটা গৃহীত উত্তরের মতো দেখায় আপনি সম্ভবত এটি চান for f in *.webm, আপনি উদ্ধৃতি দিতে ভুলে গিয়েছিলেন ${f}এবং আপনি একটি মিস করছেন --
স্টাফেন চেজেলাস

1
গৃহীত উত্তরটি ওএসএক্সে কাজ করে না, এটি কেবলমাত্র নতুন ফাইলের নাম প্রিন্ট করে, এটি আসলে ফাইলগুলির নাম পরিবর্তন করে না
ভিনি জেমস

1
অবশ্যই এটি আপনাকে নতুন ফাইলের নাম পেতে শেল বিস্তৃতি কীভাবে ব্যবহার করবেন সে প্রশ্নের উত্তর দেয় যা একটি ফাইলের নাম (সহ echo) আউটপুটও দিচ্ছে, তবে প্রয়োজনীয়টি নয়।
স্টাফেন চেজেলাস

1

যদি সেগুলি বিভিন্ন স্থানে থাকে তবে চালান: -

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

যেহেতু প্রশ্নটি হ'ল bashবাহ্যিক ইউটিলিটিগুলির কোনও প্রয়োজন নেই, যেহেতু আপনি ব্যাশ রিজেক্সস ব্যবহার করতে পারেন :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.