একটি নির্দিষ্ট ফাইল বাদে সমস্ত ফাইল কীভাবে সন্ধান করতে হয়


13

lsমত ফলে দিতে পারে

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

কিন্তু আসলে আমি শুধু খুঁজে বের করতে আশা করি CentOS-Base.repo, CentOS-Debuginfo.repoএবং CentOS-Vault.repoনা কিন্তু CentOS-Media.repo। সুতরাং আমি এই কমান্ড চালানো

ls [^\(Media\)]

তবে আমি একটি ত্রুটির তথ্য পেয়েছি Iআমি কী করব?


সম্পর্কিত:
গ্লোব

@ স্টিল্ড্রাইভার আপনার লিঙ্কের জন্য ধন্যবাদ, এটি আমার পক্ষে খুব উপকারী ..
ইয়োর

আপনি আপনার শেলটি জেডএসে স্যুইচ করার বিষয়ে বিবেচনা করতে পারেন , যার একটি প্যাটার্ন অপসারণ সুবিধা রয়েছে
বেসাইল স্টারিঙ্কেভিচ

উত্তর:


10

সর্বাধিক সাধারণ ক্ষেত্রে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন (যদি প্রথম পদটি স্থির থাকে তবে CentOS):

ls CentOS-[BDV]*

  • [BDV] - নির্দিষ্ট অক্ষরের একটি দিয়ে শুরু হওয়া দ্বিতীয় সাব-ওয়ার্ডটি নিশ্চিত করতে অক্ষর শ্রেণি

বা অবহেলা একই :

ls CentOS-[^M]*

আপনি যদি Mজিএনইউ প্রয়োগের ls(যেমনটি সাধারণত সেন্টোস-এ পাওয়া যায়) সাথে অক্ষর ধারণ করে এমন সমস্ত ফাইলের নাম উপেক্ষা করতে চান তবে -I( --ignore) বিকল্পটি ব্যবহার করুন :

ls -I '*M*'

-I, --ignore = PATTERN
শেল PATTERN- র সাথে মিলিত নিবন্ধগুলি তালিকাভুক্ত করে না

Mediaশব্দ সহ এন্ট্রি উপেক্ষা :

ls -I '*Media*'

এই নিদর্শনগুলিকে ভারব্যাটিম পাস করতে হবে ls, সুতরাং অবশ্যই উদ্ধৃত করা উচিত (অন্যথায়, শেলটি প্রসারিত করার জন্য তাদের গ্লোব হিসাবে বিবেচনা করবে)।


কেন আমরা ls *[^M]*
yode

ls CentOS-[^M]*কাজ, কিন্তু ls *[^M]*না ..
Yode

@ ইউয়েড, আপনি ঠিক কী অগ্রাহ্য করতে চান তার উপর নির্ভর করে: Mচরিত্রের উপস্থিতি বা Mediaশব্দ?
রোমানপ্রেখারেস্ট

তবে আমার ক্ষেত্রে কেবলমাত্র সেই ফাইলটির একটি চরিত্র রয়েছে M
ইয়োডে

3
নিদর্শনগুলি লোভী: প্রথম * শেষ অক্ষর ব্যতীত সমস্ত কিছুর সাথে মেলে, [^ এম] শেষ অক্ষরের সাথে মেলে কারণ এর কোনওটিরই এম দিয়ে শেষ হয় না এবং পিছনে * খালি স্ট্রিংয়ের সাথে মেলে। তাই তারা সব মিলছে। এবং এম এর সাথে যদি কিছু শেষ হয়ে যায়, তবুও এটি মিলবে, এমও কোথাও এম থেকে আলাদা কিছু আছে: ধরে নিলে যদি আপনার ওওএম নামে একটি ফাইল থাকে তবে প্রথম তারা প্রথম ও এর সাথে মিলবে, [^ এম] দ্বিতীয় ও এর সাথে মিলবে এবং
শেষের শুরুটি

12

কয়েকটি শেলের অবহেলা অপারেটরগুলি রয়েছে:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

একটি বিকল্প পতাকা findসহ ব্যবহার করা হয় -not -name। অর্থাৎ find . -not -name CentOS-Media.repo। আপনি যদি ডিরেক্টরি কাঠামোটি পুনরুক্ত করতে না চান, -maxdepth 1পতাকা যুক্ত করুন add

বিকল্পভাবে, কেউ নিম্নলিখিত লিখতে পারেন (যা অনেক জটিল, তবে আমি -notপতাকাটি ভুলে গিয়ে এই উত্তরটি মূলত পোস্ট করেছি, তাই আমি এই অংশটি মুছব না):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

আপনাকে findনাল বাইট সহ ফাইলের নাম আলাদা করতে বাধ্য করতে হবে, যাতে ফাইলের নামগুলিতে নতুন লাইনগুলি কোনও কিছু ভেঙে না ফেলে। আশা করি, grepপতাকা সহ এই জাতীয় বিভাজককে সমর্থন করে -z। আপনি সাধারণত আলাদা করে (যেমন নাল বাইট -> নতুন লাইন) এর সাথে ফিরে যেতে চাইতে পারেন wanttr '\0' '\n'


1
আপনি নাল দ্বারা পৃথক করা ফাইলের printf '%s\0' *নামগুলিও পেতে পারেন যা পুনরাবৃত্তি করে না এবং ডিফল্টরূপে ডটফিলগুলি অন্তর্ভুক্ত করে না (তবে কিছু শেলের জন্য এর বিকল্প রয়েছে)। এছাড়াও আপনি প্রয়োজন না -Eজন্য যে regexp কিন্তু খুঁতখুঁতে আপনি হয় ব্যাকস্ল্যাশ উচিত হবে .বা এটা করা [], এবং আপনি উপর নির্ভর করে না গনুহ এটি এবং grep।
dave_thompson_085

4

সবচেয়ে সহজ উপায় হ'ল অনুসন্ধান ব্যবহার করা। না:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

এখানে "চ" এর অর্থ হ'ল নিয়মিত ফাইলগুলি অনুসন্ধান করুন (যদিও নিয়মিত ফাইলগুলিতে সিমলিঙ্কগুলি অন্তর্ভুক্ত থাকে; জিএনইউ সহ find, -xtype fসেগুলি অন্তর্ভুক্ত করার পরিবর্তে ব্যবহার করুন)। আপনি যদি ডিরেক্টরি অনুসন্ধান করতে চান তবে পরিবর্তে "d" পাস করুন।

( -maxdepthশুরুতে একটি জিএনইউ এক্সটেনশন এখন বেশ সাধারণ is আপনি যদি findএটি সমর্থন না করেন তবে আপনি -maxdepth 1মান দিয়ে প্রতিস্থাপন করতে পারেন ! -name . -prune)।

দেখতে খোঁজ man পৃষ্ঠা আরো অসাধারণ সব বৈশিষ্ট্য জন্য।

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