বিশেষ অক্ষরযুক্ত ফাইলগুলি বাল্কের পুনঃনামকরণ (বা সঠিকভাবে প্রদর্শন) করা হবে


20

আমার কাছে প্রচুর ডিরেক্টরি এবং উপ-ডিরেক্টরি রয়েছে যা এই ফাইলটির মতো বিশেষ অক্ষরযুক্ত ফাইলগুলি ধারণ করে:

robbie@phil:~$ ls testsktest.txt 
test?sktest.txt

একটি অব্যাহতি ক্রম উন্মুক্ত অনুসন্ধান করুন:

robbie@phil:~$ find testsktest.txt -ls 
424512 4000 -rwxr--r-x   1 robbie   robbie    4091743 Jan 26 00:34 test\323sktest.txt

আমি এমনকি কনসোলে তাদের নামগুলি টাইপ করতে পারি তার একমাত্র কারণ হ'ল ট্যাব সমাপ্তি। এর অর্থ এই যে আমি তাদের ম্যানুয়ালি নাম পরিবর্তন করতে পারি (এবং বিশেষ চরিত্রটি ফেলা)।

আমি এলসি_এলএলকে ইউটিএফ -8 এ সেট করে রেখেছি, যা সাহায্য করবে বলে মনে হচ্ছে না (এটিও নতুন শেলের উপরে নয়):

robbie@phil:~$ echo $LC_ALL
en_US.UTF-8

আমি আমার ম্যাক থেকে এসএসএস ব্যবহার করে মেশিনে সংযোগ করছি। এটি একটি উবুন্টু ইনস্টল:

robbie@phil:~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=7.10
DISTRIB_CODENAME=gutsy
DISTRIB_DESCRIPTION="Ubuntu 7.10"

শেলটি বাশ, টিআরএম এক্সটার্ম-কালারে সেট করা আছে।

এই ফাইলগুলি বেশ কিছুদিন ধরে রয়েছে এবং উবুন্টুর সেই ইনস্টলটি ব্যবহার করে সেগুলি তৈরি করা হয়নি। সুতরাং আমি জানি না সিস্টেম এনকোডিং সেটিংসটি কী ব্যবহৃত হত।

আমি এর লাইনে জিনিস চেষ্টা করেছি:

find . -type f -ls | sed 's/[^a-zA-Z0-9]//g'

তবে আমি এমন কোনও সমাধান খুঁজে পাচ্ছি না যা আমার যা করতে চায় তা করে:

  1. অবিশ্বাস্য অক্ষরযুক্ত সমস্ত ফাইল শনাক্ত করুন (উপরের দিকটি খুব বেশি উপেক্ষা করা)
  2. ডিরেক্টরি গাছের সমস্ত ফাইলগুলির জন্য (পুনরাবৃত্তভাবে), এমভি পুরাতন নাম নতুন নাম চালান
  3. Allyচ্ছিকভাবে, বিশেষ অক্ষর যেমন ä এ-তে প্রতিলিপি করার ক্ষমতা (প্রয়োজনীয় নয় তবে দুর্দান্ত হবে)

অথবা

  1. এই সমস্ত ফাইলকে সঠিকভাবে প্রদর্শন করুন (এবং অ্যাপ্লিকেশনগুলিতে কোনও ত্রুটি নেই যখন সেগুলি খোলার চেষ্টা করছেন)

আমার কাছে বিটস এবং টুকরোগুলি রয়েছে, যেমন সমস্ত ফাইলের উপরে পুনরাবৃত্তি করা এবং সেগুলি সরানো, তবে ফাইলগুলি সনাক্তকরণ এবং এমভি কমান্ডের জন্য তাদের সঠিকভাবে ফর্ম্যাট করা শক্ত অংশ বলে মনে হয়।

কেন তারা সঠিকভাবে প্রদর্শন করে না, বা সঠিক এনকোডিংটি "অনুমান" করবেন সে সম্পর্কে অতিরিক্ত কোনও তথ্যও স্বাগত। (আমি কনফ্যাম করার চেষ্টা করেছি তবে আমি যা চাই ঠিক তেমনটি করা হচ্ছে বলে মনে হচ্ছে না: http://j3e.de/linux/convmv/ )


নীচের একক উত্তরটি প্রথম রাস্তা অনুসরণ করে (তাদের সন্ধান করুন এবং আপনার নতুন এনকোডিংটির নাম পরিবর্তন করুন), তবে দ্বিতীয় উপায়টিও আকর্ষণীয় হবে: এখন, আপনি যখন রিমোট ফাইলের নামগুলির জন্য ব্যবহৃত এনকোডিংটি জানেন, তখন কীভাবে দূরবর্তী হোস্টের কাছে এসএসএস করবেন? ফাইলনামগুলি সঠিকভাবে প্রদর্শিত হয় (এবং আপনার কীবোর্ডের সাথে তাদের নামগুলি টাইপ করে পরিচালনা করা যেতে পারে)?
ইম্জ - ইভান জাখারিয়াচেভ

উত্তর:


21

আমার ধারণা আপনি এই অবৈধ চরিত্রটি দেখেন কারণ নামটিতে একটি বাইট অনুক্রম রয়েছে যা বৈধ ইউটিএফ -8 নয়- টিপিক্যাল ইউনিক্স ফাইল সিস্টেমে ফাইলের নামগুলি (আপনার সহ) বাইট স্ট্রিং এবং কী এনকোডিং ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার জন্য অ্যাপ্লিকেশনগুলির উপর নির্ভর করে। আজকাল, ইউটিএফ -8 ব্যবহার করার প্রবণতা রয়েছে তবে এটি সর্বজনীন নয়, বিশেষত লোকালগুলিতে যেগুলি কখনই সরল ASCII এর সাথে বাঁচতে পারে না এবং ইউটিএফ -8 এমনকি বিদ্যমান থাকার আগে থেকেই অন্যান্য এনকোডিংগুলি ব্যবহার করে আসছে।

LC_CTYPE=en_US.iso88591 lsফাইলের নামটি ISO-8859-1 (ল্যাটিন -1) -র মাধ্যমে বোঝা যায় কিনা তা দেখার চেষ্টা করুন । যদি এটি না হয় তবে অন্যান্য লোকেল ব্যবহার করে দেখুন। মনে রাখবেন যে এখানে শুধুমাত্র LC_CTYPEলোকেল সেটিংয়ের বিষয় রয়েছে।

কোনও ইউটিএফ -8 লোকালে, নীচের কমান্ডটি আপনাকে এমন সমস্ত ফাইল প্রদর্শন করবে যার নাম বৈধ ইউটিএফ -8 নয়:

grep-invalid-utf8 () {
  perl -l -ne '/^([\000-\177]|[\300-\337][\200-\277]|[\340-\357][\200-\277]{2}|[\360-\367][\200-\277]{3}|[\370-\373][\200-\277]{4}|[\374-\375][\200-\277]{5})*$/ or print'
}
find | grep-invalid-utf8

তারা পুনরায় কোড বা আইকনভিভের সাহায্যে অন্য কোনও লোকেলটিতে আরও বুদ্ধিমান হয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন :

find | grep-invalid-utf8 | recode latin1..utf8
find | grep-invalid-utf8 | iconv -f latin1 -t utf8

একবার আপনি নির্ধারণ করেছেন যে একগুচ্ছ ফাইলের নাম নির্দিষ্ট এনকোডিংয়ে রয়েছে (যেমন লাতিন 1), তাদের নামকরণের একটি উপায় হ'ল

find | grep-invalid-utf8 |
rename 'BEGIN {binmode STDIN, ":encoding(latin1)"; use Encode;}
        $_=encode("utf8", $_)'

এটি ডেলিয়ান এবং উবুন্টুতে উপলব্ধ পার্ল নামকরণ কমান্ডটি ব্যবহার করে । -nআসলে ফাইলগুলির নাম পরিবর্তন না করে এটি কী করছে তা দেখানোর জন্য আপনি এটি পাস করতে পারেন ।


ধন্যবাদ আমি আজ এই বিষয়গুলির কিছু চেষ্টা করব! দেখে মনে হচ্ছে এটি গ্রহণযোগ্য উত্তর হবে :)
রবিভি

সন্ধান | গ্রেপ '[[: মুদ্রণ:]]' কমান্ডটি সমস্ত ফাইল সহজভাবে ফিরে আসে বলে মনে হচ্ছে। ইউটিএফ -8 "অন্যান্য" অক্ষর সহ অন্যান্য অনেকগুলি এনকোডিংয়ের সাথে সামঞ্জস্য করা উচিত নয়?
রবিভিভি

@ রবিভিভি: আমি টাইপ করেছিলাম এবং অপ্রিনিত grep [^[:print:]]অক্ষরগুলি অনুসন্ধান করতে চাইছিলাম । তবে আমি স্রেফ জিএনইউ গ্রেপ দিয়ে পরীক্ষা করেছি এবং অবৈধ ইউটিএফ -8 সিকোয়েন্সগুলি ধরা [^[:print:]]পড়েনি (যা বোঝায় যে তারা অক্ষয় অক্ষর নয়, তারা মোটেই অক্ষর নয়)। আমি আমার পোস্টটি অবৈধ utf8 সিকোয়েন্সগুলির সাথে গ্রেপিং লাইনগুলির দীর্ঘতর পথ দিয়ে সম্পাদনা করেছি। মনে রাখবেন যে আমি recodeএবং iconvউদাহরণগুলির দিকও স্থির করেছি ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

যে নিখুঁতভাবে কাজ। আইকনভেল ব্যতীত সমস্ত কমান্ড ব্যবহার করে চেষ্টা করা হয়েছে এবং তারা সমস্ত প্রত্যাশার মতো কাজ করে। খাঁটি যাদু!
রবিভিভি

এমনকি প্রস্তাবিত লাটিন 1 এনকোডিংটি সঠিক ছিল :)
রবিভি

1

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি একই রকম সমাধানের জন্য সারা রাত অনুসন্ধান করে যাচ্ছি। আমি কয়েকটি সহায়ক টিপস পেয়েছি তবে সেগুলি আমার যা প্রয়োজন ঠিক তা করেনি, তাই আমি যে সঠিক ফলাফলটি খুঁজছিলাম তা পেতে আমাকে কয়েকটি মিশ্রিত করতে হয়েছিল এবং মিশতে হয়েছিল

কেবল বিশেষ অক্ষর মুছে ফেলার জন্য এবং তাদের (।) বিন্দুর সাথে প্রতিস্থাপন করতে

for f in *.txt; do mv "$f" `echo $f | sed "s/[^a-zA-Z0-9.]/./g"`; done

ক্রোনজব ব্যবহার করতে আমি প্রতি মিনিটে চালানোর জন্য নিম্নলিখিতটি করি

*/1 * * * * cd /path/to/files/ && for f in *.txt; do mv "$f" `echo $f | sed "s/[^a-zA-Z0-9.]/./g"`; done >/dev/null 2>&1

আমি আশা করি যে এটি আমার দিনকে যেমন তৈরি করেছে তেমন কেউ এটি সহায়ক পেয়েছেন :)


(1) স্পষ্টতার জন্য, আপনি এটিকে পরিবর্তন `…`করতে চান $(…)- এটি , এটি এবং এটি দেখুন । (২) আপনার শেল ভেরিয়েবল রেফারেন্সগুলি (যেমন, "$f") সর্বদা উদ্ধৃত করা উচিত যদি না আপনার কাছে কারণ না থাকে এবং আপনি নিশ্চিত হন যে আপনি কী করছেন তা নিশ্চিত know এটি এমনকি প্রযোজ্য echo "$f" | sed …। এটি সম্পূর্ণ $(…)(বা `…`) প্রকাশের ক্ষেত্রেও প্রযোজ্য ; যেমন mv "$f" "$(echo "$f" | sed "…")",। … (চালিয়ে যাওয়া)
স্কট

(চালিয়ে যাওয়া) ... (3) আপনার বলা উচিত , ফাইল নামগুলির শুরু থেকে রক্ষা করার জন্য । (৪) আপনার কাছে যদি "foo ♥ bar.txt" এবং "foo ♠ bar.txt" নামক ফাইল থাকে, তবে এটি উভয়টির নাম "foo.bar.txt" রাখার চেষ্টা করবে (সম্ভবত) এটির মধ্যে একটি ব্যতীত অন্য সমস্ত কারণ হতে পারে ফাইল ধ্বংস করতে হবে। (৫) পৃথিবীতে আপনি প্রতি মিনিটে একবার এটি করতে চান কেন? mv -- "$f" …-
স্কট

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

সুতরাং (এই ফাইলে থা, টি ছিল - ডাউন_লোডড.েক্সট) রূপান্তরিত হয় (this.fi.le.tha.t.was.down.loaded.ext)
টপ্পস 70

0

এখন, যখন আপনি জানেন যে কোন এনকোডিংটি দূরবর্তী প্রান্তের ফাইলের নামগুলির জন্য ব্যবহৃত হয় ("ল্যাটিন 1" - প্রথম উত্তরের মন্তব্য অনুসারে), আপনি দ্বিতীয় উপায়টিও অনুসরণ করতে পারেন - একটি স্থানীয় টার্মিনাল চালান এবং এর মধ্যে এসএসএস করুন যেভাবে দূরবর্তী ফাইলের নামগুলি সঠিকভাবে প্রদর্শিত হয় (প্রথম উপায়ের পরিবর্তে: তাদের নাম পরিবর্তন করুন)

আমার মতো , আপনি স্থানীয়ভাবে একটি টার্মিনাল শুরু করতে পারেন যা সেই বিশেষ এনকোডিংয়ে কাজ করবে, সম্ভবত, এর মতো:

এলসি_এলএল = en_US.latin1 এক্সভিটি এবং

xvt আপনার টার্মিনাল প্রোগ্রাম জন্য দাঁড়িয়েছে।

সম্ভবত, বিদ্যমান লোকেলগুলি কল করা হয়েছিল en_US.iso88591, এবং না en_US.latin1, যেমনটি আমি ধরে নিয়েছিলাম।


0

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

শেষ পর্যন্ত আমি এসফটিপি ক্লায়েন্ট হিসাবে সংযোগ করতে ফাইলজিলা ব্যবহার করেছি, ফাইলগুলিতে ব্রাউজ করেছি এবং জিইউআই ব্যবহার করে তাদের নাম পরিবর্তন করেছি। ফাইলজিলা ডজি চরগুলি বেশ ভালভাবে পরিচালনা করেছিলেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.