.Ml ফাইলের নামগুলিতে = _iso-8859-1… দিয়ে শুরু হয়ে ফাইলের নাম ঠিক করার সরঞ্জাম?


2

আমি দ্রবীভূত একটি IMAP অ্যাকাউন্ট থেকে আমার ই-মেলগুলির ফোল্ডারফুল আছে।

ফাইলের নামটি প্রতিটি ই-মেইলের সাবজেক্ট লাইন।

দুর্ভাগ্যক্রমে, যখন একটি নন-এএসসিআইআই এনকোডিং ব্যবহার করা হয়, তখন বিষয় লাইনটি অভ্যন্তরীণভাবে দেখতে হবে এমনভাবে দেখাবে - সেগুলি উপসর্গযুক্ত =_এবং এনকোডিং ব্যবহৃত হবে:

=_UTF-8_Q_Auftragsbest=C3=A4tigung_(Kundennummer__)_=_20100819_150312_37.eml

=_windows-1252_Q_Best=E4tigung=3A_Wir_haben_Ihre_=_20100819_150310_28.eml 

ফাইল-সিস্টেমের স্তরে এটির সমাধানের জন্য সাধারণ সরঞ্জাম ব্যবহার করতে পারে এমন কোনও সরঞ্জাম কি কেউ জানেন?

একটি সমাধানের জন্য ১ টি =_ENCODINGউপসর্গটি মুছে ফেলা হবে এবং ২ যদি সম্ভব হয় তবে ফাইলের নামের এনকোডযুক্ত অক্ষরগুলিকে তাদের যথাযথ ফাইল সিস্টেমের সমতুল্য ওমলাউটে রূপান্তর করতে হবে।

আমি উইন্ডোজ or বা এক্সপি-তে রয়েছি, তবে আমি এটি একটি লিনাক্স ভিএম-তে নিতে প্রস্তুত থাকি কারণ এটি একটি বড় ফোল্ডার এবং একটি স্বয়ংক্রিয় সমাধানটি দুর্দান্ত


আপনি কি ফাইলনামে ব্যবহৃত এনকোডিংয়ের রেফারেন্সটি সরাতে চান? আমি নিশ্চিত না যে চূড়ান্ত লক্ষ্যটি কী। সম্ভবত বাল্ক পুনরায় নামকরণ (ব্যবহার bulkrenameutility.co.uk/Main_Intro.php ) এ উল্লিখিত ভর ফাইলগুলো পুনরায় নামকরণ @Pekka
Sathyajith ভাট

মূলত আপনার উদ্ধৃত-প্রিন্টেবলের সমর্থন সহ "কনফভ" এর মতো কিছু দরকার।

উত্তর:


1

আমি নিজেকে পিএইচপি স্ক্রিপ্ট তৈরি করেছি built আমি ভেবেছিলাম আমি ইভেন্টে এটি ভাগ করে নেব অন্য কেউ একই ধরণের সমস্যাটি শেষ করে। এটি আমার এবং আমার প্রয়োজনীয় এনকোডিংগুলির জন্য কাজ করে (আপনার এনকোডিংস অ্যারে প্রসারিত করতে হতে পারে)।

স্ক্রিপ্টটি MIME এনকোডযুক্ত ফাইলের নামগুলি নির্দিষ্ট ডিরেক্টরি কাঠামোর মধ্যে পুনরাবৃত্তভাবে UTF-8 এ রূপান্তর করে।

এটি সম্পূর্ণ নিখুঁত ফলাফল দেয় না: বেশ কয়েকটি বিশেষ অক্ষর রয়েছে যা দ্বিগুণ রূপান্তরিত হয়, না হয় না। আমি যতদূর দেখতে পাচ্ছি, এটি আইএমএপি রফতানিকারীর দোষ বা ই-মেলের ভিতরেই ভুল এনকোডিং তথ্য।

mb_decode_mimeheader() পুরো জিনিস হৃদয় হয়।

পাবলিক ডোমেইনে প্রকাশিত; কোনও ওয়্যারেন্টি নেই পিএইচপি 5.2 প্রয়োজন।

এটি উভয় সিএলআই এবং ওয়েবের মাধ্যমে চলতে হবে; আমি এটি ব্রাউজারে পরীক্ষা করেছি।

আপনার ডেটাতে স্ক্রিপ্টগুলি চলার আগে ব্যাকআপগুলি তৈরি করুন।

<?php

 /* Directory to parse */
 $dir = "D:/IMAP";
 /* Extensions to parse. Leave empty for none */
 $extensions = array("eml");
 /* Set to true to actually run the renaming */
 define ("GO", true);

 /* No need to change past this point */  

 /* Output content type header if not in CLI */
 if (strtolower(php_sapi_name()) != "CLI")
  header("Content-type: text/plain; charset=utf-8");


 $FixNames = new FixEmlNames($dir, $extensions);
 $FixNames->fixAll();



  class FixEmlNames
   {

     /* List of possible encodings here */
     private $encodings = array("iso-8859-1", "iso-8859-15", "windows-1252", "utf-8");
     /* Encoding Prefix. The exporter exports e.g. =_iso-8859-1_ with underscores 
        instead of question marks */
     private $encoding_prefix = "=_";
     /* Encoding postfix */
     private $encoding_postfix = "_";
     /* Temporary storage for files */
     private $files;
     /* Array of file extensions to process. Leave empty to parse all files and directories */
     private $extensions = array(); 
     /* Count of renamed files */
     private $count = 0;
     /* Count of failed renames */
     private $failed = 0;
     /* Count of skipped renames */
     private $skipped = 0;
     /* Transform forbidden characters in host OS */
     private $transform_characters = array(":" => "_", "?" => "_", ">" => "_");

     function __construct($dir, $extensions = array("eml"))
       { 

        $this->files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
        $this->extensions = $extensions;
       }

     function fixAll()
      {
        echo "Starting....\n";

        while($this->files->valid())
        {
         if (!$this->files->isDot())
          {

           $path = $this->files->key();
           $ext  = pathinfo($path, PATHINFO_EXTENSION);

           if ((count($this->extensions) == 0 ) or (in_array($ext, $this->extensions)))
            $this->renameOne($path);

          }
         $this->files->next();
        }

        echo "Done. ";

        /* Show stats */
        $status = array();

        if ($this->count > 0) $status[] = $this->count." OK";
        if ($this->failed > 0) $status[] = $this->failed." failed";
        if ($this->skipped > 0) $status[] = $this->skipped." skipped";

        echo implode(", ", $status);


      }

      function  renameOne($fullPath)
       {


          $filename = pathinfo($fullPath, PATHINFO_BASENAME); 
          $is_mime = false;

          // See whether file name is MIME encoded or not
          foreach ($this->encodings as $encoding)
           { if (stristr($filename, $this->encoding_prefix.$encoding.$this->encoding_postfix))
              $is_mime = true;
           }

           // No MIME encoding? Skip.
           if (!$is_mime)
            {
              # uncomment to see skipped files
              # echo "Skipped: $filename\n";
              $this->skipped++;
              return true;
            }

           mb_internal_encoding("UTF-8"); 
           $filename = str_replace("_", "?", $filename);  // Question marks were converted to underscores
           $filename = mb_decode_mimeheader($filename);
           $filename = str_replace("?", "_", $filename);  


           // Remove forbidden characters
           $filename = strtr($filename, $this->transform_characters);

          // Rename
          if (constant("GO") == true)
           {
            // We catch the error manually
            $old = error_reporting(0);
            $success = rename($fullPath, realpath(dirname($fullPath)).DIRECTORY_SEPARATOR.$filename); 
            error_reporting($old);        

          if ($success)
           {
           echo "OK: $filename\n";
           $this->count++; 
           return true;
           }
          else
           {
             $error = error_get_last();
             $message = $error["message"];
             $this->failed++;
             echo "Failed renaming $fullPath. Error message: ".$message."\n";
             return false;
           }
           }
           else
           {
             $this->count++;  
             echo "Simulation: $filename\n";
             return true;   
           }
       }


   }

1

যেহেতু আপনি লিনাক্সে চলে যেতে ইচ্ছুক, আপনি এটিতে একটি পিএইচপি সার্ভার ইনস্টল করতে এবং ফাইলগুলি পুনরায় কোড করতে মোটামুটি সহজ স্ক্রিপ্ট তৈরি করতে পারেন। অসুবিধার ডিগ্রি নির্ভর করে আপনি যদি কোনও প্রোগ্রামিং করেন তবে। আপনি php.net এই ফাংশন রেফারেন্স করতে পারেন

এই আপনার প্রয়োজন হবে ফাংশন

<?php

opendir  ( string $path  [, resource $context  ] )
readdir  ([ resource $dir_handle  ] )
file_get_contents(ENTER THE FILE NAMES HERE WITH A VARIABLE PASSED FROM readdir)
preg_replace(REGULAR EXPRESSION TO REMOVE THE =ENCODING part of the filename)
string mb_convert_encoding  ( string $str  , string $to_encoding  [, mixed $from_encoding  ] )
file_put_contents(THE NEW FILE NAME.eml)

?>

চিয়ার্স, আমি আসলে একজন পিএইচপি প্রোগ্রামার এবং সে পথে চলে যাব। যাইহোক, চরিত্রগুলি ডিকোড করা কেবলমাত্র তাদের উপর একটি এমবি_কন্টভার্ট_ইনকোডিং করার চেয়ে জটিল: আমি সম্পন্ন হয়ে গেলে আমি উত্তর হিসাবে সমাধান পোস্ট করব।
পেক্কা 웃

কোনও আপভোট নেই কারণ পিএইচপি স্ক্রিপ্টগুলি চালানোর জন্য কারওর জন্য লিনাক্স বা "পিএইচপি সার্ভার" প্রয়োজন হয় না।
মাধ্যাকর্ষণ

@ পেপকা - আপনার পোস্ট করা উত্তরের বিষয়ে মন্তব্য পোস্ট করার মতো আমি যথেষ্ট উচ্চ প্রতিনিধি নই। আপনি কি সঠিকভাবে এনকোডিং না করে এমন অক্ষরগুলি ঠিক করার জন্য ট্রান্সলিট বিকল্পের সাহায্যে আইকনভি () ব্যবহার করে দেখেছেন? $ আউটপুট = আইকনভি ("আইএসও -8859-1", "ইউটিএফ -8 // ট্রান্সলিট", $ ইনপুট); এটি কাজ করতে পারে
জেএমসি

@ গ্রায়েটি - আমি পিএইচপি সার্ভার ব্যতীত পিএইচপি স্ক্রিপ্টগুলি কখনই চালাইনি, আপনি এটি কীভাবে করবেন? গুগল করার চেষ্টা করা হয়েছিল, তবে প্রথম কয়েকটি ফলাফলের সাথে কিছুই নিয়ে আসে নি। আমি লিনাক্সের কথা উল্লেখ করেছি কারণ তিনি বলেছিলেন যে তিনি তার প্রশ্নে এটিতে যেতে ইচ্ছুক এবং অ্যাপাচি + পিএইচপি বেশিরভাগ লিনাক্স ডিস্ট্রোজে ইনস্টল করা সহজ।
জেএমসি

@ জেএমসি সমস্যাটি হ'ল এনকোডিংগুলি রফতানির প্রক্রিয়া থেকে অনেক আগে শুরু হয়েছিল od সুতরাং, শুরু এনকোডিংটি কী তা জানা অসম্ভব - আপনি ব্যবহার করতে পারেন mb_detect_encodingতবে এটি 100% নির্ভরযোগ্য নয়। স্ক্রিপ্টের জন্য এটি পরবর্তী পদক্ষেপ হবে যদি কেউ এটিকে আরও এগিয়ে নিতে চায় - এখন এটি কীভাবে কাজ করে তাতে আমি খুশি।
পেক্কা 웃
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.