ফাইন্ড কমান্ডের সাহায্যে কীভাবে রেজেক্স ব্যবহার করবেন?


297

আমি উত্পন্ন uuid1 স্ট্রিং সহ কিছু চিত্র রেখেছি। উদাহরণস্বরূপ 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg। আমি "ফাইন্ড" কমান্ডটি ব্যবহার করে এই সমস্ত চিত্র অনুসন্ধান করতে চাই:

find . -regex "[a-f0-9\-]\{36\}\.jpg".

কিন্তু এটি কাজ করে না। রেজেক্সে কিছু ভুল আছে? কেউ এই আমাকে সাহায্য করতে পারে?


7
সম্ভবত রিজেক্সটাইপ পরিবর্তন করুন। ডিফল্টটি হ'ল ইম্যাক্স নিয়মিত এক্সপ্রেশন , যার অর্থ যাই হোক না কেন।
প্যাভিয়াম

উত্তর:


348
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

মনে রাখবেন যে আপনাকে .*/শুরুতে নির্দিষ্ট করতে হবে কারণ findপুরো পথটির সাথে মেলে।

উদাহরণ:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

আমার সন্ধানের সংস্করণ:

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.

4
@ টম এটি কাজ খুঁজে বের করার উপায়। ম্যান পেজ অনুসারে, রেজেক্স পুরো ফাইলের পাথের সাথে মেলে, ডিরেক্টরিগুলি অন্তর্ভুক্ত রয়েছে, যার অর্থ "^ ... $"আপনার রেজেক্সকে ঘিরে একটি অন্তর্নিহিত আছে । এটি অবশ্যই পুরো ফলাফলের লাইনের সাথে মেলে।
মানি ডি

2
আমার তোমাকে দরকার মনে করি না /.*/কারণ .*বা (প্রায়) কোন চরিত্রের মিল শূন্য।
জেফ

2
তাদের জন্য (আমার মতো) যারা প্রথমবার রেগেক্সটি সঠিকভাবে পড়েননি: বিশেষ রেজেক্স অক্ষরের আগের ব্যাকস্ল্যাশগুলি নোট করুন, যেমন:\{36\}
লুকাস উইলসন-রিখটার

11
রেজেএক্স টাইপের পুরো তালিকা খুঁজে পেতে আমার সমস্যা হয়েছিল (ম্যানপেজ আপ টু ডেট নয়):valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
নোহ সুসমান

4
-regextypeপতাকাটি পতাকাটির আগে রাখার বিষয়টি নিশ্চিত করুন -regex, অন্যথায় এটি প্রয়োগ হয় না!
ক্রিস্টোফার অর

84

-regexখোঁজ এক্সপ্রেশনের সাথে মেলে পুরো নাম বর্তমান ডিরেক্টরি থেকে আপেক্ষিক পাথ সহ। এর জন্য find .সর্বদা শুরু হয় ./, তারপরে যে কোনও ডিরেক্টরি।

এছাড়াও, এগুলি emacsনিয়মিত এক্সপ্রেশন , এগুলির মধ্যে নিয়মিত এক্সপ্রেশনের তুলনায় অন্যান্য পালানোর নিয়ম রয়েছে।

যদি এগুলি সমস্ত বর্তমান ডিরেক্টরিতে থাকে তবে অবশ্যই

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'

কাজ করা উচিত. (আমি সত্যিই নিশ্চিত নই - আমি এখানে কাজ করার জন্য গণনা করা পুনরাবৃত্তি পেতে পারি না You) আপনি এড্রেপ এক্সপ্রেশনগুলিতে স্যুইচ করতে পারেন -regextype posix-egrep:

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'

(নোট করুন যে এখানে যা কিছু বলা হয়েছে তা জিএনইউ অনুসন্ধানের জন্য, আমি বিএসডি সম্পর্কে কিছুই জানিনা যা ম্যাকের উপরও ডিফল্ট)


1
আমার রেজেক্সে একাধিক মিলের স্ট্রিংয়ের জন্য আমার প্রথম বন্ধনী ছিল, সুতরাং posix-egrepটাইপটি আমার পক্ষে কাজ করেছিল।
পালসুইম

2
কিছু লক্ষণীয়, -regextypeজিএনইউর জন্য একটি বিকল্প findএবং বিএসডি নয় (অন্তত ম্যাক বিএসডি -র মতো নয়) find। যদি এই বিকল্পটি না পাওয়া যায় তবে জিএনইউ অনুসন্ধানটি ইনস্টল করতে ভুলবেন না। যদি কোনও ম্যাকের উপরে থাকে তবে পাতলা প্যাকেজটি সম্ভব findutils। অনুসন্ধান করুন এর মাধ্যমে পাওয়া যায় gfind
ড্যানটিক্স

regextype posix-egrep আমার জন্য কাজটি করেছে। আমি মনে করি ডিফল্টটি রিজেক্সটাইপ ইম্যাক্স।

35

অন্যান্য উত্তর থেকে বিচার করলে মনে হয় এটির ত্রুটি হতে পারে।

তবে আপনি এটির পরিবর্তে এটি করতে পারেন:

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

আপনি গ্রিপটি কিছুটা টুইট করতে পারেন এবং আপনি যা চান তার উপর নির্ভর করে বিভিন্ন বিকল্প ব্যবহার করতে পারে তবে এটি কার্যকর হয়।


আমার জন্য ভাল কাজ করেছে এবং রেগেক্সের সাথে সম্মানের সাথে একটি দুর্দান্ত ডিগ্রি স্বাধীনতা সরবরাহ করে।
গ্লুকন

3
এই সঙ্গে একটি downside হয় যে আপনার সুবিধা নিতে পারে না findএর -pruneকার্যকারিতা যার উপর নির্দিষ্ট ডিরেক্টরি পুরাপুরি এড়িয়ে যাবে। প্রায়শই এটি সত্যই গুরুত্বপূর্ণ নয়, তবে এটি উল্লেখ করার মতো।
আলেকজান্ডার বার্ড

-প্রিন এখনও কাজ করবে, আমার ধারণা। এটি-এক্সেক ব্যবহার করা আরও বিপজ্জনক হবে - এটি সব ফাইলেই চালিত হবে এবং গ্রেপ কেবল যেগুলি পাস করতে পারে তা নয়।
tpb261

13

অন ​​ম্যাক ওএস এক্স (বিএসডি সন্ধান) : স্বীকৃত উত্তর হিসাবে একই, .*/একটি সম্পূর্ণ পথের সাথে মেলে উপসর্গের প্রয়োজন:

$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"

man findবলছে -Eবর্ধিত রেজেক্স সমর্থন ব্যবহার করে


মনে -Eহয় উবুন্টুতে পাওয়া যায় না (ডাব্লুএসএল উবুন্টুতে পরীক্ষিত)
যুদ্ধের মতো শিম্পাঞ্জি

2
@ ক্লিভার লিটল বানর - না, স্বীকৃত উত্তরটি উবুন্টুতে কাজ করা উচিত, এই প্রকরণটি ম্যাক ওএস এক্সের জন্য বিশেষত (বা সম্ভবত ফ্রিবিএসডি এর মতো আরেকটি বিএসডি বৈকল্পিক)
স্টান কুর্দিজিয়াল

8

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

 find . -regex '\./[a-f0-9-]*.jpg'

এগুলি ছাড়াও, দেখে মনে হয় যে আমার সন্ধান (জিএনইউ ৪.৪.২) কেবলমাত্র প্রাথমিক নিয়মিত অভিব্যক্তিগুলি জানে, বিশেষত {36} সিনট্যাক্সটি নয়। আমি মনে করি আপনাকে এটি না করেই করতে হবে।


8

সহজ উপায় - আপনি শুরুতে নির্দিষ্ট করতে পারেন * কারণ পুরো পথটির সাথে মেলে।

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'

সংস্করণ সন্ধান করুন

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)

6

নিয়মিত অভিব্যক্তি সহ নির্দেশ সন্ধানের প্রয়োগ করার সময় আপনার নিখুঁত ডিরেক্টরি পথ ব্যবহার করা উচিত। আপনার উদাহরণে,

find . -regex "[a-f0-9\-]\{36\}\.jpg"

মধ্যে পরিবর্তন করা উচিত

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

বেশিরভাগ লিনাক্স সিস্টেমে নিয়মিত প্রকাশের কিছু শৃঙ্খলা সেই সিস্টেমের দ্বারা স্বীকৃত হতে পারে না, সুতরাং আপনাকে স্পষ্টভাবে উল্লেখ করতে হবে -

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.