`সন্ধান-নাম` প্যাটার্ন যা একাধিক নিদর্শনগুলির সাথে মেলে


334

আমি কমান্ডটি দিয়ে একটি ডিরেক্টরিতে সমস্ত অজগর এবং এইচটিএমএল ফাইলগুলির একটি তালিকা পাওয়ার চেষ্টা করছিলাম find Documents -name "*.{py,html}"

তারপরে ম্যান পেজটি উপস্থিত হল:

('।}') প্যাটার্নের মধ্যে থাকা বন্ধনীগুলি বিশেষ হিসাবে বিবেচনা করা হয় না (অর্থাত্ সন্ধান করুন।

এটি যেহেতু পাইপ-চেইনের অংশ, তাই আমি রানটাইমে কোন এক্সটেনশনের সাথে মেলে তা নির্দিষ্ট করতে সক্ষম হতে চাই (কোনও হার্ডকোডিং নেই)। যদি সন্ধানটি কেবল এটি করতে না পারে তবে পার্ল ওয়ান-লাইনার (বা অনুরূপ) ভাল হবে।

সম্পাদনা: শেষ পর্যন্ত আমি যে উত্তরটি নিয়ে এসেছি তা হ'ল সমস্ত ধরণের বাজে জিনিস অন্তর্ভুক্ত করে এবং এটি কিছুটা দীর্ঘও হয়, তাই আমি স্ক্র্যাচ করার চেষ্টা করছিলাম এমন মূল চুলকির উত্তর হিসাবে এটি পোস্ট করেছি । যদি আপনার আরও ভাল সমাধান থাকে তবে তা হ্যাক করতে নির্দ্বিধায় নাও।


সম্পর্কিত: ইউনিক্স এসই
তে

locateঅভ্যন্তরীণ আপডেটড আপ আপ টু ডেট নাও হতে পারে এমন সতর্কতার সাথে প্রায়শই অবহেলিত এবং অবহেলিত ইউটিলিটি is তবে এটি দ্রুত।
মাইকেল

আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করতে ভোট দিচ্ছি কারণ এটি ইউনিক্স এবং লিনাক্স-এর উপর
নির্ভর করে

উত্তর:


480

ব্যবহার করুন -o, যার অর্থ "বা":

find Documents \( -name "*.py" -o -name "*.html" \)

আপনাকে সেই কমান্ড লাইনটি প্রোগ্রামিকভাবে তৈরি করতে হবে যা এতো সহজ নয়।

আপনি কি ব্যাশ ব্যবহার করছেন (বা উইন্ডোজে সাইগউইন)? আপনি যদি হন তবে আপনার এটি করতে সক্ষম হওয়া উচিত:

ls **/*.py **/*.html

যা প্রোগ্রামক্রমে তৈরি করা সহজ হতে পারে।


3
আমি zsh ব্যবহার করছি, যা একটি সাধারণ নিয়ম হিসাবে সমস্ত বাশিজমকে সমর্থন করে আরও অনেক কিছু।
জিওনগ চিয়ামিভ

12
Zsh **পুনরাবৃত্ত অনুসন্ধানের জন্য সমর্থন করে ; বাশ এটি কেবলমাত্র 4.0 এবং পরবর্তী সংস্করণগুলিতে সমর্থন করে এবং কেবল সাথে shopt -s globstar
মোহাম্মদীর

2
আপনার কয়টি-আর্গ থাকতে পারে? আমি তৈরির জন্য .gcda (কভারেজ ডেটা) ফাইলগুলির একটি সম্ভাব্য বড় তালিকা পেয়েছি
জ্যাস্পার ব্লুজ

40
আপনি -nameযদি ব্যবহার করছেন তবে দুটি ব্র্যাকেট দিয়ে ঘিরে ফেলতে হবে -exec। যেমনfind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
আর্টব্রিজটল

2
@ আর্টব্রিস্টল মন্তব্যটি খুব প্রাসঙ্গিক যদি উদাহরণস্বরূপ, আপনি -print0স্পেস সহ ফাইলের নামগুলি হ্যান্ডেল করতে যোগ করছেন ।
নিমরোডম

63

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

উদাহরণ স্বরূপ

find . -regextype posix-egrep -regex ".*\.(py|html)$" 

উপরের উদাহরণে কৌশলটি করা উচিত। তবে এটি কোনও স্ট্যান্ডার্ড পসিক্স ফাংশন নয় এবং এটি বাস্তবায়ন নির্ভর।



12
সরল: find . -regex ".*\.\(py\|html\)$"এটি কাজ করে কারণ ইমাসস-স্টাইলের নিয়মিত এক্সপ্রেশনগুলির ডিফল্ট সন্ধান করে, যা কিছুটা আলাদা, সুতরাং আপনাকে পুনর্নির্মাণটি নির্দিষ্ট করতে হবে না।
রব্রু

2
আপনার যদি অনেকগুলি এক্সপ্রেশন থাকে তবে -regextype posix-egrepতা কার্যকর (অন্যথায় আপনাকে প্রচুর অক্ষর থেকে বাঁচতে হবে)। এই find কমান্ডের আমি Dist-হুক উইন্ডোজ বন্টন জিপ নির্মাণের জন্য ব্যবহার করেছি হয় (পরিবর্তন ফাইল খুঁজে বের করে এবং-ফাইলের মধ্যে তাদের ডস কর্তৃক eol পরিবর্তন) find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
সাইমন Sobisch

32

আপনি প্রোগ্রামগতভাবে আরও -nameক্লজ যুক্ত করতে পারেন , এর দ্বারা পৃথক -or:

find Documents \( -name "*.py" -or -name "*.html" \)

অথবা, পরিবর্তে একটি সাধারণ লুপ জন্য যান:

for F in Documents/*.{py,html}; do ...something with each '$F'... ; done

@ ব্যবহারকারী 2284570: তবে কোনও *.pyফাইল নেই বা আপনার কিছু বিজোড় সংস্করণ রয়েছে find। উপরে তালিকাবদ্ধ কমান্ডটি ঠিক কাজ করে।
স্টেফান202

না, আমি ব্যবহার করছি -iname। এটি *.pyকেবলমাত্র শেষ অবস্থানে লিখলে ফাইলগুলি ফেরত দেয় ( iname *.htmlপ্রথম অভিব্যক্তিটিও তাই ) । আমি ডিবিয়ান উপর কমান্ড ব্যবহার।
ব্যবহারকারী 2284570

আপনি কি উদ্ধৃতি ব্যবহার করছেন? এটা খুব গুরুত্বপূর্ণ।
স্টেফান202

1
এটি একটি-বা না একটি?
স্টিফেন

1
@ স্টাফেনইবার্ট: হয় ঠিক আছে তবে কেবলমাত্র পসিএক্স অনুগত (ম্যান পৃষ্ঠা অনুসারে)।
স্টেফান202

16

এটি লিনাক্সে সমস্ত .c বা .cpp ফাইলগুলি খুঁজে পাবে

$ find . -name "*.c" -o -name "*.cpp"

আপনি অতিরিক্ত কিছু মোড না করে পলায়নযোগ্য বন্ধনী প্রয়োজন নেই। এখানে ম্যান পৃষ্ঠা থেকে তারা বলছে যে প্যাটার্নটি মেলে, এটি মুদ্রণ করুন। সম্ভবত তারা মুদ্রণ নিয়ন্ত্রণ করার চেষ্টা করছেন। এক্ষেত্রে প্রিন্ট শর্তাধীন হিসাবে কাজ করে এবং "AND'd" শর্তসাপেক্ষে পরিণত হয়। এটি কোনও .c ফাইল মুদ্রণ হতে বাধা দেবে।

$ find .  -name "*.c" -o -name "*.cpp"  -print

তবে আপনি যদি মূল উত্তরটি পছন্দ করেন তবে আপনি মুদ্রণটি নিয়ন্ত্রণ করতে পারেন। এটি সমস্ত .c ফাইলগুলিও খুঁজে পাবে।

$ find . \( -name "*.c" -o -name "*.cpp" \) -print

সমস্ত সি / সি ++ উত্স ফাইলগুলির জন্য একটি শেষ উদাহরণ

$ find . \( -name "*.c" -o -name "*.cpp"  -o -name "*.h" -o -name "*.hpp" \) -print

11

আমারও তেমন দরকার ছিল। এটি আমার পক্ষে কাজ করেছে:

find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print

3
পারফেক্ট। তবে আমি এটি কিছুটা অদ্ভুত বলে মনে করি যে()
পেড্রোফুর্লা

আমি * .c * .cpp বা * .cc এর সাথে মেলে এমন দুটি ফাইল খুঁজে পেতে চেয়েছিলাম যে কেবল দুটি-নামের প্যাটার্নের সাথে আমার প্যারেন্সের দরকার নেই তবে তিন-নামের প্যাটার্ন সহ দুটি-প্যাটার্নের সাথে যুক্ত হয়ে find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0আমাকে একটি জোড়া পেরেন ব্যবহার করতে হয়েছিল দ্বিতীয় বা অপারেটর গ্রুপ। find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0এটি হতে পারে যে -প্রিন্ট 0, সর্বদা "সত্য" যুক্তিটিকে প্রভাবিত করে।
কার্ডিফ স্পেস ম্যান

5

আমার ডিফল্ট হয়েছে:

find -type f | egrep -i "*.java|*.css|*.cs|*.sql"

findব্রেন্ডন লং এবং স্টিফান202 এট আল দ্বারা কম প্রক্রিয়া ইচ্ছাকৃত মৃত্যুদণ্ড কার্যকর করার মতো :

find Documents \( -name "*.py" -or -name "*.html" \)


3
এটি egrepregexp এর সঠিক ব্যবহার নয়, আপনি শেল গ্লোব যেখানে একটি regexp ব্যবহার করা উচিত। (এছাড়াও, সাধারণ findব্যবহারটি হ'ল: find {directory} [options...] [action]যেখানে ইমপ্লের উপর নির্ভর করে directoryডিফল্ট হতে পারে .এবং এতে actionডিফল্ট -printহতে পারে তবে আমি স্পষ্ট হয়ে যাব)) সুতরাং, পরিবর্তে, এর মতো কিছু ব্যবহার করুন: find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$' তবে এর পরিবর্তে সত্যিকারের দ্রুত বিকল্প হিসাবে find, একটিও হতে পারে locateএকটি অনুরূপ ফ্যাশনে চেষ্টা করুন (তবে তা আপ টু ডেটের প্রয়োজন নেই, যেহেতু এটি কোনও ফাইল তালিকার জন্য কোনও অভ্যন্তরীণ ডিবিকে জিজ্ঞাসা করে)
মাইকেল

2
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done

সহজ কিন্তু কাজ :)


1

আমার কিছু ফাইল বাদে চাইল্ড ডায়ারে সমস্ত ফাইল সরিয়ে ফেলা দরকার ছিল। নিম্নলিখিতগুলি আমার জন্য কাজ করেছে (তিনটি নিদর্শন নির্দিষ্ট করা হয়েছে):

find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' +

1

\(\)নামের প্যাটার্ন সহ প্যাটার্নের মধ্যে ধনুর্বন্ধনী প্রয়োজনor

find Documents -type f \( -name "*.py" -or -name "*.html" \)

andঅপারেটরের সাথে নামের প্যাটার্নের জন্য এটির প্রয়োজন নেই

find Documents -type f ! -name "*.py" -and ! -name "*.html" 

0

এটি এআইএক্স কর্ন শেলের উপর কাজ করে।

find *.cbl *.dms -prune -type f -mtime -1

এটি বর্তমান ডিরেক্টরিতে কেবল সাব-ডিরেক্টরিগুলি বাদ দিচ্ছে *.cblবা *.dmsএটি 1 দিনের পুরানো সন্ধান করছে।


0
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"

2
মনে রাখবেন যে দ্বিতীয়টি foo.jmg এর সাথে মিলবে তবে সেরা দুজনের কেউই মিলবে না।
তামার.হাট

0

কি সম্পর্কে

ls {*.py,*.html}

এটি তাদের ফাইলের নামগুলিতে .py বা .html দিয়ে শেষ হওয়া সমস্ত ফাইল তালিকাভুক্ত করে

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