আমি কীভাবে এলএস এবং এমভি সহ এমএস-ডস স্টাইল ওয়াইল্ডকার্ড ব্যবহার করতে পারি?


9

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

একাধিক ফাইলের নামকরণ - দুটি ওয়াইল্ডকার্ড ব্যবহার করা

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\>rename *.txt *.bak

c:\> dir

Directory of c:\
    file1.bak
    file2.bak
    file3.bak
    file4.bak

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

একটি একক ফাইলের নামকরণ - একটি ওয়াইল্ডকার্ড ব্যবহার করা

c:\> dir

Directory of c:\
    file1.txt

c:\>rename file1.txt *.bak

c:\> dir

Directory of c:\
    file1.bak

দীর্ঘ এবং অযৌক্তিক ফাইলের নাম পরিবর্তন করার সময় এটি বিশেষত সহায়ক হবে। আমি ভেবেছিলাম সম্ভবত আমি এটি ব্যবহার mv file1.txt $1.bakকরতে পারলাম file1.txt.bakযা গ্রহণযোগ্য হবে তবে আমি নিশ্চিত নই যে আপনি $1কোনও শেল কমান্ড দিয়ে প্যারামিটার ইনলাইনটি উল্লেখ করতে পারবেন । আবার এই বিশেষ ক্ষেত্রে এমএস-ডস কীভাবে *ওয়াইল্ডকার্ডকে ফাইলের নামের অংশের জন্য ক্যাপচার / ম্যাচ প্রতিস্থাপনের জন্য ব্যবহার করতে পারে তা কীভাবে উপযুক্ত of

একটি ওয়াইল্ডকার্ডের সাথে ডিরেক্টরি তালিকা ফিল্টার করা

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt
    text.txt
    \temp       (directory) 

c:\> dir file*

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\> t*

Directory of c:\
    text.txt
    \temp       (directory) 

আমি নিশ্চিত নই যে lsএটির সাথে করার জন্য সঠিক বাক্য গঠন কী বা এটি এমনকি সম্ভব যদি হয়। আমি যদি এমন কিছু করি তবে ls t*এটি দিয়ে ডিরেক্টরিতে পুনরাবৃত্তি হবে t। আমার কাজের ভিত্তি হয় হয় ব্যবহার করা হয় find . --max-depth 1 -iname "t*"বা এর মতো কিছু ls -al | grep t- যা উভয়ই হিসাবে সংক্ষিপ্ত এবং সহজ dir t*

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

সুতরাং কিভাবে আমি করতে পারেন mvএবং lsফাইল একই উপায় যে আমি করতে ব্যবহৃত dirএবং renameফাইল?

উত্তর:


15

উইন্ডোজ cmdএবং পসিক্স শেলের মধ্যে অন্যতম মৌলিক পার্থক্য হ'ল কে ওয়াইল্ডকার্ড বিস্তারের জন্য দায়ী। শেলগুলি আপনার জিজ্ঞাসা করা প্রকৃত আদেশগুলি শুরু করার আগে প্রয়োজনীয় সমস্ত বিস্তৃতি করে। cmd বেশিরভাগই ওয়াইল্ডকার্ডের নিদর্শনগুলি অবিশ্রুত কমান্ডগুলিতে পাস করে। (আমি বেশিরভাগ ক্ষেত্রেই বলি, যেহেতু আমি মনে করি ব্যতিক্রমগুলি রয়েছে এবং বেশিরভাগ পরিস্থিতিতে পরিবেশের পরিবর্তনগুলি প্রসারিত হয়েছে)) এটি এমন একটি লেখা তৈরি করে renameযা একইভাবে সিনট্যাক্সের সাথে কাজ করে যেমন cmdবেশ জটিল।

তবে renameলিনাক্সের জন্য একটি রয়েছে - সম্পূর্ণ ভিন্ন যুক্তি সহ, ম্যান পৃষ্ঠাটি দেখুন (যা আমার সিস্টেমে কিছুটা ক্ষুদ্র হয় এবং এটি আমার সিস্টেমে renameথাকা util-linuxপ্যাকেজ থেকে আসে , যা বহুলভাবে উপলভ্য হওয়া উচিত)। আপনার প্রথম নামটি এইভাবে করা হবে:

rename .txt .bak *.txt

মনে রাখবেন যে শেলটি *সম্প্রসারণ করে, তাই renameনিজেই মনে করে যে এটি এ জাতীয়ভাবে আহ্বান করা হয়েছিল:

rename .txt .bak file1.txt file2.txt file3.txt ...

সুতরাং আপনি একক ফাইল সংস্করণ অনুমান করতে পারেন:

rename .txt .bak file1.txt

আপনি যদি এটি ব্যবহার না করে renameনিজেই প্রয়োগ করতে চান তবে আপনি তার জন্য একটি ফাংশন তৈরি করতে পারেন। ধরে নিচ্ছেন আপনি কেবল ফাইলের এক্সটেনশানটি পরিবর্তন করতে চান এবং একক-ফাইলের পুনরায় নামকরণের জন্য এটি দেখুন:

$ function chext() {
  newext="$1"
  file="$2"
  newfile="${file%.*}$newext"
  echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfileমূল এক্সটেনশানটি ছড়িয়ে দিতে একটি স্ট্রিং রিমুভাল ব্যবহার করে তৈরি করা হয়েছে , তারপরে নতুন এক্সটেনশানটিকে সম্মতি জানায়। তুলনামূলকভাবে সহজেই একাধিক ফাইল হ্যান্ডেল করতে আপনি সেই ফাংশনটি প্রসারিত করতে পারেন।


আপনার lsপ্রশ্নের হিসাবে , -dস্যুইচ ব্যবহার করুন । এটি lsডিরেক্টরিগুলির বিষয়বস্তু তালিকাবদ্ধকরণ থেকে বিরত থাকবে ।

ডেমো:

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

ওয়াইল্ডকার্ডের নতুন নামকরণ

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

একক-ফাইলের পুনরায় নামকরণ

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

ডিফল্ট ls

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls এটি ডিরেক্টরিগুলি পরিদর্শন করে না

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

খুব সুন্দর! আমি মনে করি আমি আমার লিনাক্স-ফু দিয়ে একটি বেল্ট সরিয়ে নিয়েছি! ধন্যবাদ!
cwd

এটি দিয়ে কিছুটা অগ্রগতির টিপস (এবং সমস্যাগুলি এড়ান): সাধারণ somefunc *.Extপ্যাটার্নগুলি বা স্ক্রিপ্টগুলি ব্যবহার করুন যখন আপনি যদি সেই প্যাটার্নটি কোনও ফাইলের সাথে মেলে না, তবে কী হয় তা দেখার জন্য এবং আপনি কোনও প্যাটার্ন পাস করার ব্যবস্থা করেন কিনা তা দেখার জন্য উদ্ধৃতি দিয়ে খেলুন ( এটি প্রসারিত না করে) ফাংশনগুলির মধ্যে। সুরক্ষা টিপ: গ্লোব্বিং / শেল প্রসারণ নিয়ে পরীক্ষার সময় কোথাও ব্যবহার করবেন নাrm :-)
মাদুর

4

ওয়াইল্ডকার্ডের কথা মনে রাখার একটি বিষয় হ'ল এগুলি শেল দ্বারা প্রসারিত। আপনি ওয়াইল্ডকার্ড ব্যবহার করেছেন বা নাম টাইপ করেছেন তা অ্যাপ্লিকেশনটি জানে না। উদাহরণস্বরূপ, আপনি যদি টাইপ করেন rename *.txt *.bakতবে renameকমান্ডটি এরকম কিছু দেখায় rename file1.txt file2.txt existingfile.bak। এটি যথেষ্ট তথ্য নয় on

আমি lsপ্রথমটি নিয়ে প্রশ্নটি করব , কারণ এটি সহজ। যদি আপনি যা চান তা হ'ল মিলে যাওয়া নামগুলি, তবে আপনার প্রয়োজন হবে না ls, কারণ শেলটি ইতিমধ্যে সম্প্রসারণ করছে।

echo t*

আপনি যদি ফাইলগুলি সম্পর্কে আরও তথ্য চান, তবে ডিরেক্টরিগুলির বিষয়বস্তু তালিকাভুক্ত না করার জন্য এটি বলার জন্য -dবিকল্পটি পাস করুন ls

ls -ld t*

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

for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done

ফাইলগুলির নামকরণের জন্য বেশ কয়েকটি সাধারণ ইউটিলিটি রয়েছে যার মধ্যে কোনওটি নির্দিষ্ট ইউনিক্স সিস্টেমে ইনস্টল করার গ্যারান্টিযুক্ত নয়, তবে এর সবগুলিই ইনস্টল করা সহজ। এখানে মূল বিষয়গুলি:

  • renameutil-linuxস্যুট থেকে , প্রতিটি নন-এম্বেড থাকা লিনাক্স সিস্টেমে উপলব্ধ (এবং অন্য কোথাও নেই)। ডেবিয়ান এবং ডেরিভেটিভগুলিতে (উবুন্টু সহ), এই আদেশটি বলা হয় rename.ul। শর্ত থাকে যে .txtচূড়ান্ত এক্সটেনশন ছাড়া অন্য কোনও ঘটনা নেই , আপনি লিখতে পারেন

    rename .txt .bak *.txt
    
  • renameডেলিয়ান এবং ডেরিভেটিভস জাহাজ হিসাবে পাঠানো একটি পার্ল স্ক্রিপ্ট /usr/bin/rename। আপনি নির্বিচারে পার্ল কমান্ড অনুযায়ী ফাইলের নাম পরিবর্তন করতে পারেন।

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv, যা বেশ কয়েকটি নাম-ভিত্তিক নিদর্শন অনুসারে ফাইলগুলির নাম পরিবর্তন, অনুলিপি এবং লিঙ্ক করতে পারে এবং একটি টার্গেটের নাম ইতিমধ্যে উপস্থিত থাকলে কী ঘটে তা সম্পর্কিত অনেকগুলি বিকল্প রয়েছে। নোট করুন যে শেল দ্বারা প্রসারিত হওয়া থেকে ওয়াইল্ডকার্ডগুলিকে রক্ষা করতে আপনার অবশ্যই উদ্ধৃতিগুলি ব্যবহার করতে হবে।

    mmv '*.txt' '#1.txt'
    
  • zmvএটি একটি zsh ফাংশন, যদি কেবলমাত্র আপনার শেলটি zsh থাকে তবে উপলভ্য। এটি স্বেচ্ছাসেবী zsh প্যাটার্নগুলির সাথে মেলে (যাতে আপনি কেবল ওয়াইল্ডকার্ড নয়, স্বেচ্ছাসেবী নিয়মিত অভিব্যক্তি অনুসারে ফাইলের নামগুলি মেলাতে পারেন এবং আপনি তারিখ এবং মাপের মতো অন্যান্য মানদণ্ডের সাথে ফাইলগুলি মেলাতে পারেন)। zmvঅনুলিপি এবং লিঙ্ক করতে পারেন।

    zmv '(*).txt' '$1.txt'
    

আপনি যে মেশিনগুলি ব্যবহার করেন তার উপর যদি আপনার কিছু নিয়ন্ত্রণ থাকে তবে আমার সুপারিশটি হ'ল zsh কে আপনার শেল হিসাবে ব্যবহার করুন (এটির অন্যান্য উপকারিতা রয়েছে) এবং আপনার এই লাইনগুলি রাখুন ~/.zshrc:

autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'

noglobএকটি zsh বৈশিষ্ট্য যা শেলকে আদেশের আর্গুমেন্টে ওয়াইল্ডকার্ডগুলি প্রসারিত না করতে বলে। এইভাবে আপনি লিখতে পারেন zmv *.txt \$1.txt(আপনাকে সর্বদা $প্রতিস্থাপন পাঠ্যে সুরক্ষিত রাখতে হবে )।

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