আমার কাছে বিভিন্ন ফাইল ধরণের প্রায় 12000 চিত্র রয়েছে তবে তাদের প্রত্যেকটির নামকরণ করা হয়েছে * .jpg।
এখন আমি তাদের যথাযথ এক্সটেনশনগুলি ফিরিয়ে দিতে চাই, আমি কীভাবে এটি করতে পারি
আমার কাছে বিভিন্ন ফাইল ধরণের প্রায় 12000 চিত্র রয়েছে তবে তাদের প্রত্যেকটির নামকরণ করা হয়েছে * .jpg।
এখন আমি তাদের যথাযথ এক্সটেনশনগুলি ফিরিয়ে দিতে চাই, আমি কীভাবে এটি করতে পারি
উত্তর:
আপনি এটি তুলনায় তুলনামূলকভাবে সহজেই করতে পারেন:
for f in *jpg; do
type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
এটি @ এবি এর উত্তর হিসাবে একই ধারণা কিন্তু পরিবর্তে শেল গ্লোব ব্যবহার করছে find
। ${f%%.*}
তার এক্সটেনশন ছাড়া ফাইলের নাম নেই। -0
এর file
কমান্ড এটি একটি প্রিন্ট তোলে \0
ফাইলের নাম যা আমরা তারপর ব্যবহারের পরে grep
ফাইল প্রকার। এটি ফাঁকা স্থান, নিউলাইনস বা অন্য যে কোনও কিছু অন্তর্ভুক্ত করে ফাইলে নাম সহ নির্বিচারে কাজ করা উচিত। ${type,,}
ছোট হাতের এক্সটেনশান পান করার জন্য একটি কৌতুক। এটি রূপান্তরিত PNG
হবে png
।
আপনি আপনার প্রশ্নে বলেননি, তবে আপনার যদি এটিকে পুনরাবৃত্ত হওয়ার এবং সাব-ডিরেক্টরিতে অন্তর্ভুক্ত করার প্রয়োজন হয়, আপনি পরিবর্তে এটি ব্যবহার করতে পারেন:
shopt -s globstar
for f in **/*jpg; do
type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
এটি shopt -s globstar
বাশের গ্লোবস্টার বিকল্পটি সক্ষম করবে যা **
উপ-ডিরেক্টরিগুলি মেলাতে দেয় :
globstar
যদি সেট করা থাকে তবে একটি প্যাথনাম এক্সপেনশন প্রসঙ্গে ব্যবহৃত প্যাটার্ন ** সমস্ত ফাইল এবং শূন্য বা আরও বেশি ডিরেক্টরি এবং সাব ডিরেক্টরিতে মিলবে ories যদি প্যাটার্নটি অনুসরণ করে /, কেবলমাত্র ডিরেক্টরি এবং সাব-ডিরেক্টরিগুলি মেলে।
**
সাব ডিরেক্টরিতে পুনরাবৃত্তি করতে দেয় ।
file
এটি সর্বদা এক্সটেনশানটিকে নির্দিষ্ট করে না বলে মনে হয়: foo.bourne-again
উদাহরণস্বরূপ এটি এখানে একটি বাশ ফাইলটি রূপান্তর করছে !
নীচের স্ক্রিপ্টটি (পুনরাবৃত্তভাবে) একটি সঠিকভাবে সেট এক্সটেনশনের নাম পরিবর্তন করতে, সঠিকটির জন্য ব্যবহার করা যেতে পারে .jpg
। যদি এটি অপঠনযোগ্য ফাইলের সন্ধান করে তবে এটি স্ক্রিপ্টের আউটপুটে এটি রিপোর্ট করবে।
স্ক্রিপ্ট ব্যবহার imghdr
মডিউল, নিম্নলিখিত প্রকারের চিনতে: rgb
, gif
, pbm
, pgm
, ppm
, tiff
, rast
, xbm
, jpeg
, bmp
, png
। এখানেimghdr
মডিউল আরও । লিঙ্কে উল্লিখিত অনুসারে তালিকা আরও প্রকারের সাথে বাড়ানো যেতে পারে।
এটি যেমন রয়েছে, .jpg
প্রশ্নটিতে উল্লিখিত হিসাবে এটি বিশেষত এক্সটেনশনের সাথে ফাইলগুলির নাম পরিবর্তন করে। একটি ছোটখাটো পরিবর্তন সহ, কোনও এক্সটেনশন বা এক্সটেনশনের একটি নির্দিষ্ট সেটকে সঠিকভাবে (বা এখানে কোনও এক্সটেনশন ছাড়াই ) নামকরণের উপযুক্ত হতে পারে ।
#!/usr/bin/env python3
import os
import imghdr
import shutil
import sys
directory = sys.argv[1]
for root, dirs, files in os.walk(directory):
for name in files:
file = root+"/"+name
# find files with the (incorrect) extension to rename
if name.endswith(".jpg"):
# find the correct extension
ftype = imghdr.what(file)
# rename the file
if ftype != None:
shutil.move(file, file.replace("jpg",ftype))
# in case it can't be determined, mention it in the output
else:
print("could not determine: "+file)
rename.py
কমান্ড দ্বারা এটি চালান:
python3 /path/to/rename.py <directory>
দ্রষ্টব্য: আমার পদ্ধতিটি খুব জটিল বলে মনে হচ্ছে। আমি আপনার জায়গায় টর্ডন উত্তর পছন্দ করব।
file
ফাইলের ধরন নির্ধারণ করতে আপনি কমান্ডটি ব্যবহার করতে পারেন :
% file 20050101_14-24-37_330.jpg
20050101_14-24-37_330.jpg: JPEG image data, EXIF standard 2.2, baseline, precision 8, 1200x1600, frames 3
% file test.jpg
test.jpg: PNG image data, 1192 x 774, 8-bit/color RGBA, non-interlaced
এই তথ্য দিয়ে, ফাইলগুলির নাম পরিবর্তন করা যেতে পারে:
আপনি আপনার চিত্রগুলিতে কমান্ড প্রয়োগ করার আগে দয়া করে একটি পরীক্ষা করুন
find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} |
awk -F " image data" '{print $1}' |
awk -F"<separator> " '{
system("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)
}'
উদাহরণ
% find . -type f -name "*.jpg"
./test.jpg
./sub/20050101_14-24-37_330.jpg
% find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} | awk -F " image data" '{print $1}' | awk -F"<separator> " '{system ("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)}'
% find . -type f -iname "*"
./test.PNG
./sub/20050101_14-24-37_330.JPEG
find -exec bash -c "..."
সেখানকার সমস্ত কিছু ব্যবহার করুন এবং করুন বা while read -d '' name type
ফাইলের নাম এবং file
আউটপুটকে বিভক্ত করতে ব্যবহার করুন এবং তারপরে $type
ফাইলের প্রকারটি পার্স করতে পারেন। সত্যিই এটির পক্ষে মূল্য নেই, খাঁটি (ইশ) ব্যাশে এটি কীভাবে আরও সহজে করা যায় তার জন্য আমার উত্তর দেখুন।