বিশেষ প্রথম অক্ষর (উদাহরণস্বরূপ with) দিয়ে ফাইলের নাম নিয়ে কাজ করা


30

আমি সম্প্রতি একটি ফাইল এসেছি যার নাম '♫' অক্ষর দিয়ে শুরু হয়। আমি এই ফাইলটি অনুলিপি করতে, এটিতে ফিড করতে এবং ffmpegটার্মিনালের বিভিন্ন উপায়ে রেফারেন্স করতে চেয়েছিলাম । আমি সাধারণত অদ্ভুত ফাইলের নাম স্বয়ংক্রিয়ভাবে পূর্ণ করি তবে এটি ব্যর্থ হয় কারণ আমি এমনকি প্রথম অক্ষরটি টাইপ করতে পারি না।

আমি একটি অনুলিপি-পেস্ট চালনার জন্য মাউসটিতে স্যুইচ করতে চাই না। আমি সম্ভাব্য পরিস্থিতিতে জন্য একগুচ্ছ কোড মুখস্থ করতে চাই না। আমার অ্যাডহক সলিউশনটি ছিল চরিত্রটিকে প্রশ্নে স্যুইচ করা vim, আটকানো !lsএবং অনুলিপি করা, তারপরে প্রস্থান করে টার্মিনালে আটকানো। এটি কাজ করেছে তবে বেশ ভয়াবহ।

এই জাতীয় পরিস্থিতিগুলি মোকাবেলার জন্য কি আরও সহজ উপায় আছে?

দ্রষ্টব্য: আমি যদি মাছের শেলটি পরিবর্তন করে তবে এটি ব্যবহার করছি।


7
এটির সাথে কাজ করার জন্য আপনি ফাইলের অন্যান্য অংশগুলি একটি রেজেেক্স তৈরি করতে ব্যবহার করতে পারেন? *restoffile.aviনাকি এরকম কিছু?
slm

1
এক্ষেত্রে বাকী নামটি কানজি এবং কাটাকানার (জাপানি লিপি) মিশ্রণ ছিল, তাই সহজেই নয়।
জিরকনকোড

3
বুঝেছি, ভেবেছি আমি জিজ্ঞাসা করব। জিম্মিজের উত্তর কি তখন সমাধান করে? আপনার আপত্তিজনক ফাইলগুলির একটি স্ক্রিনশট আটকানো কি মনে হবে? এটি সম্ভবত অন্যদের জন্য সহায়ক হবে যা পরে এটি পড়তে পারে।
slm

1
আমি এখনই এটি কাজ করার চেষ্টা করছি আমি কীভাবে স্ক্রিনি পোস্ট করতে জানি না তবে নীচের কমান্ডগুলি চালানো আপনাকে আমার বিদ্রূপের সমস্যা দেবে:touch '♫ 漢字カ' touch '♫ 漢字タ'
জিরকনকোড

1
Zsh এর সাহায্যে আপনি ট্যাবগুলির জন্য অপশন ব্যবহার করতে পারেন যা আপনাকে একটি মেনু দেয় যা থেকে আপনি উপযুক্ত ফাইলটি নির্বাচন করতে পারেন।
কেভিন

উত্তর:


35

ফাইলের নামের প্রথম অক্ষরটি যদি মুদ্রণযোগ্য হয় তবে আলফানিউমারিক বা হোয়াইটস্পেস নাও আপনি [[:punct:]]গ্লোব অপারেটর ব্যবহার করতে পারেন :

$ ls *.txt
f1.txt  f2.txt  ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt

হুম আমি এই গ্লোব অপারেটরগুলি সম্পর্কে জানতাম না, আমি সেগুলি পড়েছিলাম এবং কিছুটা শিখেছি (ধন্যবাদ), এটি আমার সমস্যাটি সমাধান করে যা আমার ডিয়ারের একটি একক অদ্ভুত ফাইল ow এখন আমার একটি বিশাল ভিড়ের সাথে এই সমস্যা আছে ফাইলগুলি, আমি কি নতুন প্রশ্ন জিজ্ঞাসা করব বা এটিকে আপডেট করব?
জিরকনকোড

আমি আপনার উত্তরটি গ্রহণ করেছি, আমি সময় পেলে আগামীকাল দ্বিতীয় দৃশ্য পোস্ট করব। সাহায্যের জন্য আপনাকে ধন্যবাদ।
জিরকন কোড

6

আমার কাছে সবচেয়ে সহজ যেটি ঘটে তা হ'ল ls [^a-zA-Z0-9]*এবং এটি আমার জন্য কৌশলটি করে, তবে টেরডনের উত্তর এক্সটগ্লোব শেল বিকল্প বা এমনকি শেল-স্বতন্ত্র পদ্ধতির দিকে মনোযোগ দেওয়ার ক্ষেত্রে আরও ভাল।


এটি এটিতে একটি শালীন পর্যাপ্ত ছুরিকাঘাত। আপনি ls [^[:alnum:]]*একই জিনিস জন্য পারে । তবে এটি বর্ণের শ্রেণিটি যেমন ব্যবহার করা ভাল , তার চেয়ে ক্লাসটি (এস) না ; সুতরাং ls [[:punct:]]*এই ফাইলটি তালিকাভুক্ত করা হবে।
ধনী

6

প্রিন্টযোগ্য অক্ষরগুলির সাথে লিল করার জন্য ls এর কিছু সুইচ রয়েছে (যেমন - কোট নাম, --escape, --literal) তবে এই ক্ষেত্রে এটি অক্ষরটি "মুদ্রণযোগ্য" তবে "টাইপযোগ্য" নয় (কমপক্ষে আমার কীবোর্ডে! ), সুতরাং এইগুলির মধ্যে কোনওটিই সহায়তা করছে বলে মনে হচ্ছে না।

সুতরাং, কোনও নাম হিসাবে কোনও অক্ষর দিয়ে ফাইলগুলি পরিত্রাণ পেতে সাধারণ "বর্বর শক্তি" পদ্ধতির হিসাবে আপনি এটি করতে পারেন:

$ /bin/ls -1A|cat -n  # list all files (except . and ..), 1 per line, add line numbers
     1  ♫
     2  f1.txt
     3  f2.txt

আপত্তিজনক ফাইল সহ লাইনটি সন্ধান করুন। বেশ সম্ভবত এটি 1 ম লাইন হবে, তবে আসুন আমরা এটি 5 তম বলি। মুদ্রণ লাইন 5 এবং হেক্স এটিকে এনকোড করেছে:

$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a                                      ....

0a (নিউলাইন) চরিত্রটিকে উপেক্ষা করে একটি পালানোর স্ট্রিং তৈরি করুন এবং এস্কেপগুলি অনুবাদ করতে ইকো -e বিকল্পটি ব্যবহার করুন:

$ echo -e '\xe2\x99\xab'
♫

এখন আপনি এটি অনুলিপি / সরানো / মুছতে পারেন:

$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’

এছাড়াও, আপনি যদি শেল স্ক্রিপ্ট ব্যবহারের মধ্যে সীমাবদ্ধ না হন, আপনি পাইথনে এটি এর মতো করতে পারেন:

$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')

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

for f in os.listdir('.'):
  if not f.isalnum():
    newname = generate_newname(f)
    if not os.path.exists(newname):
      shutil.copy(f, newname)
    else:
      print newname, 'already exists!'

5

"সাধারণ" অক্ষর দিয়ে শুরু হয় না এমন সমস্ত ফাইল তালিকাভুক্ত করার জন্য অনুরূপ পন্থা হবে। ব্যাশে আপনি এটি দিয়ে এটি করতে পারেন

$ shopt -s extglob
$ ls !([[:alpha:]]*)

তবে এটি উপলভ্য বলে মনে হচ্ছে না fish, সুতরাং আপনি এর findপরিবর্তে ব্যবহার করতে পারেন :

$ find . -type f -not -name '[[:alpha:]]*'

4

সিমলিঙ্কগুলি পুনরায় নামকরণ করুন

বিশেষ অক্ষরের সাথে ফাইলের নামগুলি হ্যান্ডেল করার জন্য একটি পদ্ধতি - প্রথম অক্ষর হিসাবে বা ফাইলের অন্য কোনও জায়গায় সহজ নামগুলির নামকরণ করা

আপনার মূল ফাইলনামগুলি রাখা দরকার থাকলেও এটি ব্যবহার করা যেতে পারে : ফাইল নামগুলির একটি অনুলিপি পুনরায় নামকরণ করুন।
এটি ফাইলগুলি অনুলিপি করেই করা যেতে পারে, তবে ফাইলগুলিতে সিমলিঙ্ক বা হার্ডলিঙ্ক তৈরি করে এবং এগুলির নাম পরিবর্তন করে। cpঅপশনটি -s( -lহার্ডলিঙ্কগুলির জন্য) পরিবর্তে প্রতিলিপি তৈরি করে ।

নামগুলি পরিষ্কার করতে "ডিটক্স" ব্যবহার করুন

ফাইলের নাম পরিষ্কার করার জন্য নামকরণের জন্য, detoxব্যবহার করা যেতে পারে; এটি কোনও detoxrcফাইলে সংজ্ঞায়িত অনুযায়ী বিভিন্ন বিধি অনুসারে ফাইলের নাম পরিষ্কার করার জন্য ফাইলগুলির নাম পরিবর্তন করে । ডিফল্টরূপে, ইউটিএফ 8 অক্ষর সবেমাত্র সরানো হয়; বিকল্পের সাহায্যে -s utf_8-onlyতারা তাদের দ্বারা প্রতিস্থাপিত হয় _:

$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only * 
$ ls -1                
_ ___
_foo


সিমলিঙ্কগুলিতে "ডিটক্স"

উপরে বর্ণিত মত সিমলিঙ্কগুলিতে কাজ করার সাথে একত্রিত:

$ mkdir orig
$ cd orig 
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean 
$ cp -s ../orig/* .
$ ll               
lrwxrwxrwx 1 14 Oct  8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct  8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll                                
lrwxrwxrwx 1 21 Oct  8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct  8 05:52 _foo -> ../orig/♫foo

2

আমি ব্যবহার করি না fish, তবে ডকুমেন্টেশনটি বলে যে আপনি কোনও ইউনিকোড অক্ষরটি \u(16-বিট অক্ষরের জন্য) বা \U(32-বিট অক্ষরের জন্য) এর হেক্স অক্ষর কোডটি উপস্থাপন করে প্রবেশ করতে পারেন । আমি মনে করি কোড হয় 491eb, তাই আপনি কাজ করতে পারে:

mv \U000491ebabc.mp3 abc.mp3

নামান্তর করতে ♫abc.mp3

নোট করুন যে আপনার নেতৃস্থানীয় শূন্যগুলির প্রয়োজন, অন্যথায় abcশেষে হেক্স ডিজিট এবং অক্ষর কোডের অংশ হিসাবে গণ্য হবে; 32-বিট চরিত্রের জন্য আপনার 8 টি সংখ্যা লিখতে হবে।


2

আমি জানি না যে আপনি যখন প্রশ্নটি জিজ্ঞাসা করেছিলেন তখন এটি ইতিমধ্যে ঘটেছিল, তবে বর্তমান সংস্করণগুলিতে fish(2019 হিসাবে) আপনি Tabদুটি বার চাপতে পারেন, আপনি zsh- শৈলীর নির্বাচন পেতে যেখানে আপনি তীর কীগুলি ব্যবহার করতে পারেন দৃশ্যমানভাবে ফাইল নামের কোনও অংশ টাইপ না করে আপনি চান ফাইলটি নির্বাচন করুন।


2

মাছ নকশা দ্বারা বন্ধনী ওয়াইল্ডকার্ড সমর্থন করে না ।

function find_special_filename
    find ! -path './.*' -name '[^-.a-zA-Z0-9_]*' $argv
end

কমান্ড গোপন ডিরেক্টরি ও প্রদর্শন ফাইলের নামের যে অক্ষর দিয়ে শুরু না অনুসন্ধান করে না letters, digits, . _ -(ডকুমেন্টেশন CF find)।

দ্রষ্টব্য: $argv একটি বিশেষ অ্যারে ভেরিয়েবল (ফিশ শেল) যা এতে ফাংশন আর্গুমেন্টগুলি অন্তর্ভুক্ত করে তাই অন্তর্নিহিত কমান্ডটি কোনও অভিব্যক্তি পেতে পারে (উদাহরণস্বরূপ ওরফে )।

find_special_filename -exec mv '{}' misc/ \;

¹ আসলে, ফিশ ব্র্যাকেট সম্প্রসারণ (অ্যারে ভেরিয়েবল এক্সপেনশন) সমর্থন করে তবে বাশ আরও একটি পরিভাষা (পরামিতি এবং ফাইলের নাম বিস্তৃত) ব্যবহার করে।



0

আপনি এই সমস্যাযুক্ত ফাইলের নাম রাখতে চান কিনা তা আপনি বলেননি। একটি সমাধান হতে পারে আপনার এই ফাইলটি যে স্ক্রিপ্টটি চালিয়ে টাইপ করতে পারেন তার ফাইলগুলির নাম পরিবর্তন করে (কিছু বা সমস্ত) একবার এবং সবার জন্য "সমাধান" করা:

#!/bin/sh
for old in *
do
      printf "%s ...? " "$old"
      if read new  &&  [ "$new" != "" ]
      then
             mv -i "$old" "$new"
      fi
done

এটি প্রতিটি আপনার অনুসরণ করে থাকা ফাইলের নাম তালিকাভুক্ত করবে ...?Enterযেমন আছে তেমন একটি ফাইল রেখে টাইপ করুন; বা নাম পরিবর্তন করতে একটি নতুন নাম টাইপ করুন। -iবিকল্প এটি মুছে নিশ্চিত করতে যদি আপনি অন্য বিদ্যমান ফাইল এর নাম উল্লেখ আপনি জিজ্ঞাসা করতে হবে।

এই স্ক্রিপ্টটি বিভিন্ন উপায়ে সংশোধন করা যেতে পারে:

  • আপনি ওয়াইল্ডকার্ডকে ( *) আরও কিছু নিয়ন্ত্রিত কিছুতে পরিবর্তন করতে পারেন, উদাহরণস্বরূপ *.avi *.mov, যাতে আপনাকে প্রতিটি ফাইলের দিকে নজর দিতে হবে না।
  • আপনি এতে পরিবর্তন করতে mvপারবেন cp, সুতরাং আপনি ফাইলটির বর্তমান নাম সহ একটি অনুলিপি রাখবেন এবং একটি টাইপযোগ্য নাম সহ একটি (অস্থায়ী?) অনুলিপি তৈরি করুন।
  • আপনি বিদ্যমান ফাইলের উপর ভিত্তি করে একটি নতুন ফাইল নাম তৈরি করতে পারেন। উদাহরণ স্বরূপ,

    if read pfx  &&  [ "$pfx" != "" ]
    then
            mv -i "$old" "$pfx$old"
    fi
    

    যা আপনাকে পুরানো নামের সামনে একটি উপসর্গ চাপতে দেয়। আপনি যদি একটি অনন্য উপসর্গ চয়ন করেন, এটি আপনাকে স্বতঃপূর্ণ ব্যবহার করতে দেবে।

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