সঠিক ফাইল এক্সটেনশান


15

আমার কাছে বিভিন্ন ফাইল ধরণের প্রায় 12000 চিত্র রয়েছে তবে তাদের প্রত্যেকটির নামকরণ করা হয়েছে * .jpg।

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


2
পুনরাবৃত্তি, বা একটি "ফ্ল্যাট" ডিরেক্টরিতে?
জ্যাকব Vlijm


1
@steeldriver চমত্কার বন্ধ, কিন্তু ঐ ফাইল জানলে না একটি এক্সটেনশন আছে, এখানে তারা আছে ভুল এক্সটেনশান।
জ্যাকব ভিলিজম

1
@JacobVlijm যে কেন আমি পতাকা সদৃশ হিসাবে প্রশ্ন করেনি: তবে পদ্ধতিতে প্রস্তাবিত উত্তর মান এখানে আছে, এই প্রোগ্রামটিতে
steeldriver

@ স্টাইলড্রাইভার আমি সম্পূর্ণরূপে একমত
জ্যাকব Vlijm

উত্তর:


22

আপনি এটি তুলনায় তুলনামূলকভাবে সহজেই করতে পারেন:

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উদাহরণস্বরূপ এটি এখানে একটি বাশ ফাইলটি রূপান্তর করছে !
ক্যাম্পা

1
@ ক্যাম্পা নং, অবশ্যই না। এটি বাইনারি ফাইলগুলি, সাধারণ পাঠ্য ফাইলগুলি, পার্ল এবং পাইথন স্ক্রিপ্টগুলিতে বোগাস এক্সটেনশন যুক্ত করে এবং তালিকাটি এগিয়ে যায়। প্রশ্নটি বিশেষত চিত্রগুলির বিষয়ে জিজ্ঞাসা করছিল এবং তাদের সাধারণ বর্ধনের মতো একই নাম রয়েছে। মনে রাখবেন যে লিনাক্সের এক্সটেনশনগুলি alচ্ছিক, খুব অল্প ব্যতিক্রম ছাড়া তারা আসলে কিছুই করে না। তারা ব্যবহারকারীকে তাদের ডেটা সংগঠিত করতে সহায়তা করে, ওএস তাদের যত্ন করে না।
টেরডন

11

নীচের স্ক্রিপ্টটি (পুনরাবৃত্তভাবে) একটি সঠিকভাবে সেট এক্সটেনশনের নাম পরিবর্তন করতে, সঠিকটির জন্য ব্যবহার করা যেতে পারে .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)

কিভাবে ব্যবহার করে

  1. একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন rename.py
  2. কমান্ড দ্বারা এটি চালান:

    python3 /path/to/rename.py <directory>
    

বাশ ভিত্তিক সমাধানগুলির বিপরীতে সহজ এবং পড়তে সহজ জন্য +1।
ডেভিড

3

দ্রষ্টব্য: আমার পদ্ধতিটি খুব জটিল বলে মনে হচ্ছে। আমি আপনার জায়গায় টর্ডন উত্তর পছন্দ করব।


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