গ্লোব ম্যাচ থেকে একটি প্যাটার্ন বাদ দিন


53

একই বেস ফাইল নামটি সহ আমার বেশ কয়েকটি ফাইল রয়েছে। আমি একটি ব্যতীত সমস্ত অপসারণ করতে চাই

foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc

আমি এক রাখা প্রয়োজন না করে থাকেন, আমি ব্যবহার করতে পারে জানেন rm foo.*

TLDP প্রমান ^একটি ম্যাচ অস্বীকার করেন। পরীক্ষা এবং ত্রুটির মাধ্যমে, আমি এটি সন্ধান করতে সক্ষম হয়েছি

rm foo.*[^org]

আমার যা প্রয়োজন তা করে, তবে বাক্য গঠনটি আমি আসলে বুঝতে পারি না।

এছাড়াও, আমার ব্যবহারের ক্ষেত্রে সীমাবদ্ধতা না থাকলেও, আমি মনে করি এই প্যাটার্নটিও উপেক্ষা করে foo.oএবং foo.or। এই প্যাটার্নটি কীভাবে কাজ করে এবং এমন এক গ্লোব কী দেখায় যা কেবল উপেক্ষা করে foo.org?


1
একটি ছাড়াও উত্তর এটা যে উল্লেখ করতে সাধ্যমতো @glen হিসেবে rm foo.*[^org]সমস্ত ফাইল যা সরিয়ে ফেলা গত চরিত্র তন্ন তন্ন o, rবা g, তাই foo.fooপারেন মেলে না।
jimmij

আপনি একটি ব্যবহার করছেন Regular Expression। আপনার গ্রুপিং অক্ষরগুলি সম্পর্কে আপনার যত্নবান হওয়া উচিত। বন্ধনী ব্যবহার করে আপনি একটি অক্ষর বর্গ অর্থ যে আপনি কোনো ফাইল বর্ণ দিয়ে একটি এক্সটেনশন ছিল মুছতে হবে নির্দিষ্ট কিছু o, rবা gকোনো অনুক্রমে। একটি গোষ্ঠী তৈরি করতে এবং অক্ষরের ক্রম সংরক্ষণের জন্য প্রথম বন্ধনী ব্যবহার করুন।
মিঃ মাস্কারো

3
@ jbarker2160 - এটি আসলে কোনও নিয়মিত প্রকাশ নয়, এটিকে সাধারণত একটি গ্লোব (বা ফাইলনামের প্যাটার্ন ) বলা হয়, যা নিয়মিত এক্সপ্রেশনের কম-বেশি হয় - বিশদ বিবরণের জন্য বাশ ম্যান্যাপের প্যাটার্ন মেলানো বিভাগটি দেখুন। তার প্যাটার্নটি বিন্দুর পরে যেখানে শেষ অক্ষরটি o, r বা g নয় তার সাথে এক বা একাধিক অক্ষর দিয়ে foo.*[^org]শুরু হওয়া যে কোনও ফাইলের foo.নামের সাথে মিলবে । সুতরাং এটি মেলে দিবে foo.orb, কিন্তু না foo.orgবা foo.orবা foo.o। গ্লেনজ্যাকম্যানের উত্তরটি দেখায় যে কীভাবে কোনও ম্যাচকে অস্বীকার করার জন্য বর্ধিত প্যাটার্ন মেলানো বৈশিষ্ট্যগুলি সক্ষম করতে হয়।
জনি 17

উত্তর:


52
shopt -s extglob
echo rm foo.!(org)

এটি "ফু"। "org" কিছুই অনুসরণ করে

রেফ: https://www.gnu.org/software/bash/manual/bashref.html# প্যাটার্ন- ম্যাচিং


আমি একই কাজ করার চেষ্টা করেছি কিন্তু বন্ধনীর সাহায্যে এবং স্পষ্টতই যখন বন্ধনী ব্যবহার করে এটি কাজ করে না
ডোনাতো

4
একাধিক ফাইলের নামের সাথে মিলের বাক্য গঠন কী? বলুন আমি .org, .png, .txt বাদ দিতে চাই?
ফ্রিডো

@Freedo @(): একটি প্যাটার্ন-তালিকার জন্য stackoverflow.com/a/217208/3779853
phil294

23

ব্যাশে, আপনিও ব্যবহার করতে পারেন GLOBIGNORE="*.org"; rm -i foo*

এবং unset GLOBIGNOREহয়ে গেলে।

এটি এর চেয়ে সত্যই ভাল নয় shopt -s extglobতবে এটি মনে রাখা আমার পক্ষে সহজ easier


5
@ রুসলান এটি কাজ করে না। আপনার করা উচিত( GLOBIGNORE="*.org"; rm -i foo* )
DBedrenko

3
দ্রষ্টব্য আপনি যদি উপেক্ষা করা তালিকার তালিকাটি প্রসারিত করতে চান তবে কোনও কোলন দিয়ে আলাদা করুন যেমনGLOBIGNORE="*foo*:*bar*"
ফায়াত

7

একটি পাইপ করতে পারেন?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(সম্ভবত আপনি শেষ চেইনে আরএমের সাথে প্রতিধ্বনিকে প্রতিস্থাপন করতে চাইতে পারেন)।


মাত্র এক লাইনে প্রয়োজনে দরকারী।
ব্রুশেস্কয়াস

1
সহজেই মনে রাখা সহজ (আমার জন্য, আমি প্রায়শই এই ধরণের জিনিসটি করি) এবং আরও জটিল প্রক্রিয়াজাতকরণ বুট করার অনুমতি দেয় :)
ড্রেভিকো

1
ls -1সমস্ত ফাইল grepপৃথকভাবে পরিচালিত হয় তা নিশ্চিত করার জন্য আরও নির্ভরযোগ্য হওয়া উচিত
মাইকেলচিরিকো

0

ওপি খুব কাছাকাছি ছিল:

rm foo.*[^o][^r][^g]

যদিও এই ক্ষেত্রে *অপ্রয়োজনীয়।

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