`[!]` (বন্ধনীগুলিতে বিস্ময়বোধক চিহ্ন) ব্যাশের ওয়াইল্ডকার্ড


10

আমি বিশ্বব্যাপী নিদর্শন এবং ওয়াইল্ডকার্ডগুলি জুড়ে এসেছি এবং আমার কাছে বিশেষ আগ্রহ [!]

এই কনস্ট্রাক্টটি কন্সট্রাক্টের অনুরূপ [!], বন্ধনীগুলির মধ্যে কোনও অক্ষরের সাথে মিল না রেখে এটি কোনও অক্ষরের সাথে মিলবে, যতক্ষণ না এটি [এবং এর মধ্যে তালিকাভুক্ত না থাকে ]

rm myfile [!192]

উপরোক্ত আমি বিশ্বাস করি যে যে কোনও / সমস্ত ফাইলের নামে 192 নাম রয়েছে তা বাদ দিয়ে যে কোনও / সমস্ত ফাইল সরিয়ে ফেলবে।

ফাইল এক্সটেনশন সহ এটির যথাযথ ব্যবহার এবং বিশেষত একাধিক শর্তে আমি উদ্বিগ্ন।

এমন পরিস্থিতিতে উপযুক্ত বাক্য গঠন কী হবে?

rm myfile [!.gif .csv. mp3] 

অথবা

rm myfile [!.gif !.csv !.mp3]

আমার উদ্বেগটি হল যে সময়কালটি ভুল জায়গায় স্থান পরিবর্তন হতে পারে এবং সুতরাং যখন নির্দিষ্ট ফাইলগুলির কারসাজির কারণ হতে চাইছি তখন একটি (যা অবশ্যই তাদের কোনওটি অবশ্যই থাকবে?) সহ কোনও ফাইল .হস্তান্তরিত হবে।

এই কনস্ট্রাক্টটি কন্সট্রাক্টের অনুরূপ [ ], বন্ধনীগুলির মধ্যে কোনও অক্ষরের সাথে মিল না রেখে এটি কোনও অক্ষরের সাথে মিলবে, যতক্ষণ না এটি [এবং এর মধ্যে তালিকাভুক্ত না থাকে ]

( http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm থেকে উদ্ধৃত )

এখন; আমার কাছে যা প্রস্তাব দেয় যে তখন একক একক !পর্যাপ্ত, এবং তার পরে সমস্ত মান সীমার মধ্যে থাকা।


5
সাধারণ টিপ হিসাবে , দৌড়ানোর আগে, গ্লোব্বিং আপনার পছন্দ মতো করা হয়েছে কিনা তা যাচাই ls my-patternবা ব্যবহারের echo my-commandজন্যrm
Wayne_Yux

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

2
মনে রাখবেন যে আপনার প্রথম উদ্ধৃতিটি ভুলভাবে লেখা হয়েছে, এখন এটি মূলত বলে মনে হচ্ছে [!]এটি একই রকম তবে পছন্দ নয়[!]
ইলক্কাচু

2
এটি উল্লেখযোগ্য যে ^এর !এই প্রসঙ্গে যেমন সঠিক অর্থ রয়েছে , তাই ঠিক এর মতোই [^a]বাদ দেয়: যদি প্রথম অক্ষরটি অনুসরণ করা হয় তবে এটি একটি! বা একটি ^ তারপরে আবদ্ধ নয় এমন কোনও চরিত্রের মিল রয়েছে। ( )a[!a]man bash
মিষ্টি

3
rm myfile [!192]সরাবে myfile, সেইসাথে কোন একক চরিত্র ফাইল নামে না 1, 9অথবা 2
কেভিন

উত্তর:


16

উদ্ধৃতি man 7 glob:

An  expression  "[!...]"  matches  a single character, namely any character
that is not matched by the expression obtained by removing the first '!' from it.
(Thus, "[!]a-]" matches any single character except ']', 'a' and '-'.)

এখানে একক অক্ষরের অংশের উপর জোর দেওয়া , []বাশ প্যাটার্ন ম্যাচিংয়ে পুরো স্ট্রিংয়ের জন্য ব্যবহার করা যাবে না।


bashএর ব্রেস এক্সপেনশনটি স্ট্রিংগুলির সাথে মেলে ব্যবহার করা যেতে পারে, তবে এগুলি উপেক্ষা করার কোনও উপায় (আমি জানি না)। যেমন

1.{gif,csv,mp3}

প্রসারিত হয়

1.gif 1.csv 1.mp3

এই ফাইলগুলি বিদ্যমান কিনা তা বিবেচনা করে না।


যেহেতু ডাব্লুচারগিন পয়েন্টেড shoptপ্রসারিত প্যাটার্ন মেলানো অপারেটরগুলিকে সক্ষম করতে ব্যবহার করা যেতে পারে, তাদের মধ্যে অন্যতম !()। দৌড়ানোর পরে shopt -s extglob, যেমন

1.!(gif|csv|mp3)

প্রসারিত হয়

1.jpg 1.bmp 1.png

যদি সেই ফাইলগুলি বর্তমান ডিরেক্টরিতে বিদ্যমান থাকে। আরও পড়ার জন্য man bash(বিভাগটি এক্সপ্যানশন / পাথনাম এক্সপেনশন) এবং পাথনাম এক্সপেনশন (গ্লোববিং)


আপনি যা করার চেষ্টা করছেন তার জন্য আমি সর্বদা ব্যবহার করব find, যা প্রত্যাখ্যান এবং আরও অনেক কিছু সরবরাহ করে, যেমন নিম্নলিখিত উপায়ে:

find . -maxdepth 1 -type f ! -name "*.gif" -a ! -name "*.csv" -a ! -name "*.mp3"

এটি কেবল অনুসন্ধানগুলি তালিকাভুক্ত করে, আপনি যদি এগুলি সরাতে চান তবে কমান্ডের শেষে-delete বিকল্পটি যুক্ত করুন । সর্বদা যথাযথ পদক্ষেপগুলি অপসারণের সাথে: সর্বদা সাবধানতার সাথে প্রথমে পরীক্ষা করুন

findখুব ভাল দ্বারা ব্যাখ্যা করা দরকারী বিকল্পগুলির একটি টন সরবরাহ করে man find


1
নোট করুন যে এই findআদেশটি পুনরাবৃত্ত হয় ( সম্পাদনা করুন: এটি পূর্বরূপে দেখানো হয়েছিল - আমি সম্ভবত এটি অতিরিক্ত প্রাসঙ্গিক তবে অযৌক্তিক তথ্যের জন্য এই মন্তব্যটি রাখতে পারি)। কেবলমাত্র বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলি অনুসন্ধান করার জন্য এটির উপ-ডিরেক্টরিগুলিও নয় - এবং এই -deleteক্রিয়াটি যুক্ত করা হলে কেবল সেই ফাইলগুলি মুছুন - আপনি -maxdepth 1অবিলম্বে যুক্ত করতে পারেন find .। এটি এটিকে গ্লোব্বিংয়ের প্রভাবের সাথে সামঞ্জস্য করে আনবে, কারণ শ্যাশ globstarবিকল্পটি চালু না করা এবং **ব্যবহার না করা পর্যন্ত গ্লোবগুলি বাশ-এ অবিরাম ব্যবহারযোগ্য। প্রশ্নের মধ্যে প্রদর্শিত গ্লোব সমস্ত শেলগুলিতে নিরর্থক।
এলিয়াহ

2
"কোন উপায় (আমি জানি) তাদের অস্বীকার করা হয়" -সঙ্গে shopt -s extglob, আপনি ব্যবহার করতে পারেন echo 1.!(gif|csv|mp3), যা সব ছাপে 1.extযেখানে extনয় gif, csvঅথবা mp3। ("প্যাটার্ন ম্যাচিং" এর man bash
সাবেকশন দেখুন

10

আমি মনে করি আপনি বন্ধনী ব্যবহারের ভুল বোঝেন। [abc]ম্যাচ এক অক্ষরের a, bবা c[!abc]ম্যাচ এক চরিত্র যে না a , bবা c। তাই কমন্ড

rm myfile [192]

সরাবে myfileএবং ফাইল 1, 9এবং 2কারণ আপনার myfile এবং বন্ধনী মধ্যে একটি স্থান আছে। বিপরীতে, আদেশ

rm myfile[192]

ফাইলগুলি মুছে ফেলবে myfile1, myfile9এবং myfile2


সত্য। ব্যবহার করা ভাল find
pLumo

আসলে [] একটি ব্যাপ্তির জন্য ব্যবহৃত হয়, [!] একটি একক অক্ষর
IronUhlan

1
@ আয়রনউহ্লান, তারা উভয়ই একটি পরিসর বা অক্ষরের একটি তালিকা নেয়। এটি অন্যটি একটি অবহেলা।
ilkkachu

7

বন্ধনীগুলি [ ]একটি অক্ষর শ্রেণিকে বোঝায়। তাদের ভিতরে কোনও একক অক্ষর প্রদত্ত অবস্থানে মেলে। সুতরাং

file[192]

তিনটি সম্ভাব্য নামের সাথে মেলে:

file1
file2
file9

এটি মেলে নাfile192 , কারণ এটি কেবল পরে একক চরিত্রের সাথে ডিল করে file

বন্ধনীগুলিতেও আমরা ব্যাপ্তি ব্যবহার করতে পারি। [0-9]প্রদত্ত অবস্থানে যে কোনও একক অঙ্কের সাথে মেলে। দুটি সংখ্যার জন্য, আমাদের দরকার [0-9][0-9]। বড় অঙ্কের পরে একটি অঙ্কের জন্য, আমরা ব্যবহার করতে পারি [0-9][A-Z]...

! অবহেলা নির্দেশ করে।

file[!192]

fileবাদে 1বা 9বা পরে কোনও একক অক্ষরযুক্ত ফাইলগুলির সাথে মিলবে 2। উদাহরণস্বরূপ এটি মিলবে file7এবং filesএবং file%(এবং আরও অনেক) তবে মিলবে না file192 , কারণ এতে দুটি অতিরিক্ত অক্ষর রয়েছে।

আপনার ব্যবহারের ক্ষেত্রে, আমি findপরিবর্তে ব্যবহার করার পরামর্শ দিই [!]। এটি একটি notঅপারেটর আছে।

এটিও পুনরাবৃত্ত , যার অর্থ এটি ডিফল্টরূপে সমস্ত উপ-ডিরেক্টরিতে যায়। আপনি এটি -maxdepth 1চান তা যদি আপনি এটি বর্তমান ডিরেক্টরিতে সীমাবদ্ধ করতে পারেন। শেল ওয়াইল্ডকার্ডস (গ্লোব্বিং) অ-পুনরাবৃত্ত (যদিও এর সাথে পুনরাবৃত্ত গ্লোব্বিং **সক্ষম করা যায়)।

ধরে নিই যে আপনি সিমলিঙ্কগুলি মোছা এড়াতে চান না, আমরা -type dকোনও ডিরেক্টরি মুছে ফেলা এড়াতে অবহেলা পরীক্ষায় যুক্ত করতে পারি । সেই পরামর্শের জন্য এলিয়াহ কাগানকে ধন্যবাদ।

find /path -maxdepth 1 -not \( -type d -or -iname "*.gif" -or -iname "*.csv" -or -iname "*.mp3" \)

আপনি যদি চান তা দেখতে পান, আপনি আবার কমান্ডটি দিয়ে চালাতে পারেন -delete

find /path -maxdepth 1  -not \( -type d -or -iname "*.gif" -or -iname "*.csv" -or -iname "*.mp3" \) -delete

2
এবং আমি মনে করি আপনি একবারে একাধিক রেঞ্জও করতে পারেন। উদাহরণস্বরূপ, হেক্সাডেসিমাল [0-9a-fA-F]
উইলসন

@ জান্না, হ্যাঁ! আমি আসলে অনুসন্ধানটি ব্যবহার করছিলাম :) বুঝতে পারিনি এটির "না" অপারেটর রয়েছে :)
IronUhlan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.