পুনরাবৃত্তভাবে সমস্ত ফাইলগুলিতে ফাইল এক্সটেনশন যুক্ত করুন


106

আমার কাছে কয়েকটি ডিরেক্টরি এবং উপ-ডিরেক্টরি রয়েছে যার মধ্যে ফাইল এক্সটেনশন নেই files আমি .jpgএই ডিরেক্টরিগুলির মধ্যে থাকা সমস্ত ফাইলগুলিতে যুক্ত করতে চাই । আমি ফাইল এক্সটেনশান পরিবর্তনের জন্য বাশ স্ক্রিপ্টগুলি দেখেছি তবে কেবল একটি যুক্ত করার জন্য নয়। এটি পুনরুক্তি করা প্রয়োজন, কেউ দয়া করে সাহায্য করতে পারেন?

উত্তর:


228

সুস্পষ্ট লুপ ( man find) ছাড়াই বিকল্প কমান্ড :

find . -type f -exec mv '{}' '{}'.jpg \;

ব্যাখ্যা: এটি পুনরুক্তরূপে -type fবর্তমান ডিরেক্টরি ( .) থেকে শুরু করে সমস্ত ফাইল ( ) সন্ধান mvকরে এবং তাদের প্রতিটিটিতে মুভি কমান্ড প্রয়োগ করে ( )। চারপাশের উদ্ধৃতিগুলিও নোট করুন {}, যাতে স্পেসগুলির ফাইল ফাইল (এবং এমনকি নতুন লাইনের ...) সঠিকভাবে পরিচালনা করা হয়।


7
বিশেষত, ডিরেক্টরি কাঠামোতে বিশাল সংখ্যক ফাইল উপস্থিত থাকলে (ফাইলটি তালিকার পুনরাবৃত্তির জন্য দৈর্ঘ্যের কারণে ব্যাশ বিচলিত হতে পারে) এটি আরও ভাল কাজ করে।
ডারএল

@ অল, আপনি যদি forফাইলগুলির একটি তালিকাতে পুনরাবৃত্তি করতে কোনও লুপ বিপর্যস্ত ব্যাশ উল্লেখ করেন তবে এটি সঠিক নয়। বাশ forলুপটি পুনরায় প্রতিটি mvকমান্ড জারি করে ।
নিক

প্রশ্ন: বিবৃতি findকার্যকর করার আগে ফাইলগুলির একটি তালিকা প্রথমে সেট আপ করে -exec? আমার ধারণা তাই, তবে অসীম লুপগুলি কোডিংয়ের আগে এই বিষয়টিটি পরিষ্কার হওয়া চাই।
বোল্ডউইন

2
এই কমান্ডটি এক্সটেনশন সহ ফাইলগুলিও সন্ধান করবে। ওপি কি সেটাই চায়?
ghostdog74

1
@ ঘোস্টডগ 74৪: যেহেতু তিনি এই উত্তরটি গ্রহণ করেছেন, উপরোক্ত দৃশ্যত কৌশলটি করেছেন। অন্যথায়, আপনি নীচের হিসাবে উল্লিখিত হিসাবে, যুক্ত করা -not -name "*.*"কৌশলটি করবে।
স্টেফান202

62

এটি এক্সটেনশন ছাড়াই ফাইলগুলি সন্ধান করবে এবং আপনার .jpg যুক্ত করবে

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;

এটি অবশ্যই 99% সময় কাঙ্ক্ষিত ফলাফল সরবরাহ করবে। +1
লেস

9

এটি কিছুটা দেরি হয়ে গেছে, তবে আমি ভেবেছিলাম যে এখানের সমাধানগুলির চেয়ে আরও ভাল সমাধান (যদিও কম পাঠযোগ্য) তবে এটি যুক্ত করব:

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'

find | xargsপ্যাটার্নটি ব্যবহার করলে সাধারণত আরও কার্যকর কার্যকর হয়, কারণ আপনাকে প্রতিটি ফাইলের জন্য একটি নতুন প্রক্রিয়া তৈরি করতে হবে না।

নোট করুন যে এর জন্য প্রথাগত নাম পরিবর্তনের পরিবর্তে দেবিয়ান-গন্ধযুক্ত ডিস্ট্রোস (ওরফে প্রামনাম) -এর নামের পুনর্নবীকরণের সংস্করণ প্রয়োজন। এটি কেবল একটি ক্ষুদ্র পার্ল স্ক্রিপ্ট, যদিও, কোনও সিস্টেমে উপরের কমান্ডটি ব্যবহার করা যথেষ্ট সহজ হবে।


4

এটার মত,

for f in $(find . -type f); do mv $f ${f}.jpg; done

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

আপনি যদি অন্য কোনও ডিরেক্টরি থেকে কমান্ডটি কার্যকর করতে চান তবে আপনি এটির সাথে
প্রতিস্থাপন করতে পারেন ।find .find /target/directory


1
এটি একটি 'কর' অনুপস্থিত এবং ফাইলনামে যদি ফাঁকা স্থান থাকে তবে ফাইলের নামটি উদ্ধৃত করা ভাল: f ইন; এর জন্য (সন্ধান করুন-টাইপ এফ); do mv "$ f" "$ {f} .jpg"; সম্পন্ন হয়েছে
9

এবং সম্ভবত আমি শীর্ষ স্তরের ডিরেক্টরি থেকে চালাতে হবে?
রবজমিলস

@ সিঞ্জি: হ্যাঁ নোট করুন যে এই কমান্ডটি ড্যাশ ইনকেও মিস করে -type
স্টেফান202

আমাকে কোথাও যেতে হয়েছিল এবং খুব দ্রুত টাইপ করতে হয়েছিল ... এখনই ঠিক করা।
নিক

1

উইন্ডোজ বেসিক কোনও এক্সটেনশন ছাড়াই সমস্ত ফাইলের নামকরণের জন্য আপনি ren * *.jpg যেহেতু ফাইলটি কোনও এক্সটেনশন হিসাবে করতে পারেন , কেবল * ব্যবহার করুন, বা আপনি যদি পিএনজি jpg ব্যবহার করতে চানren *.png *.jpg


0

rename

নিশ্চিত না যে এটি এক্সটেনশন ছাড়াই ফাইলগুলির নাম পরিবর্তন করতে পারে (আমি এখনই উইন্ডোজ 7 এ আছি)


1
এটি পারে, তবে এটি ডিরেক্টরিগুলির নামও পরিবর্তন করে দেবে এবং উপ-ডিরেক্টরিতে এটি পুনরুক্তিভাবে কাজ করতে বলার কোনও উপায় নেই (কমপক্ষে উবুন্টুতে আমার যে সংস্করণ রয়েছে তা দিয়ে)।
মিরোড

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