Regex को find कमांड के साथ कैसे उपयोग करें?


297

मेरे पास उत्पन्न uuid1 स्ट्रिंग के साथ कुछ चित्र हैं। उदाहरण के लिए 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg। मैं "खोज" कमांड का उपयोग करके इन सभी छवियों का पता लगाना चाहता हूं:

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

लेकिन यह काम नहीं करता है। Regex में कुछ गड़बड़ है? क्या कोई मेरी मदद कर सकता है?


7
शायद regextype को बदलें। डिफ़ॉल्ट Emacs नियमित अभिव्यक्ति है , जो भी इसका मतलब है।
पावियम

जवाबों:


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
@ यह काम खोजने में regex तरीका है। मैन पेज के अनुसार, रेगेक्स पूरे फाइल पथ से मेल खाता है, जिसमें डायरेक्टरी शामिल है, जिसका अर्थ है कि "^ ... $"आपके रेगेक्स के आसपास एक निहितार्थ है। यह WHOLE परिणाम पंक्ति से मेल खाना चाहिए।
मन्नी डी

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'

कार्य करना चाहिए। (मुझे वास्तव में यकीन नहीं है - मुझे यहां काम करने के लिए गिने गए पुनरावृत्ति नहीं मिल सकती है।) आप द्वारा एवरेज एक्सप्रेशंस में बदल सकते हैं -regextype posix-egrep:

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

(ध्यान दें कि यहां जो कुछ भी कहा गया है वह जीएनयू खोज के लिए है, मुझे बीएसडी के बारे में कुछ भी नहीं पता है जो मैक पर भी डिफ़ॉल्ट है।)


1
मेरे regex में कई मिलान स्ट्रिंग्स के लिए मुझे कोष्ठक था, इसलिए posix-egrepप्रकार ने मेरे लिए काम किया।
पालिविस्म

2
नोट करने के लिए कुछ, -regextypeजीएनयू findऔर बीएसडी के लिए एक विकल्प है (कम से कम मैक बीएसडी की तरह नहीं) find। यदि यह विकल्प उपलब्ध नहीं है, तो GNU खोज को स्थापित करना सुनिश्चित करें। अगर एक मैक पर काढ़ा पैकेज के साथ संभव है findutils। खोजें तो के माध्यम से उपलब्ध है gfind
3

regextype posix-egrep ने मेरे लिए कार्य किया। मुझे लगता है कि डिफ़ॉल्ट regextype emacs है।
घुसपैठ की

35

अन्य उत्तरों को देखते हुए, ऐसा लगता है कि यह गलती हो सकती है।

हालाँकि आप इसे इस तरह से कर सकते हैं:

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

आपको जीआरईपी को थोड़ा मोड़ना होगा और जो आप चाहते हैं उसके आधार पर विभिन्न विकल्पों का उपयोग कर सकते हैं लेकिन यह काम करता है।


मेरे लिए अच्छी तरह से काम किया और रेगेक्स के संबंध में स्वतंत्रता की एक बड़ी डिग्री प्रदान करता है।
ग्लूकोन

3
इस के साथ एक नकारात्मक पक्ष यह है कि आप का लाभ नहीं ले जा सकते है findकी -pruneकार्यक्षमता है जिस पर कुछ निर्देशिकाओं को पूरी तरह छोड़ देगा। सबसे अधिक बार यह वास्तव में महत्वपूर्ण नहीं है, लेकिन यह ध्यान देने योग्य है।
अलेक्जेंडर बर्ड

-प्रत्यक्ष अभी भी काम करेंगे, मुझे लगता है। यह उपयोग करने के लिए और अधिक खतरनाक होगा -exec - यह सभी फाइलों पर चलेगा और न कि केवल उन grep को पारित करने की अनुमति देता है।
tpb261

13

Mac OS X (BSD खोज) पर : स्वीकृत उत्तर के समान, .*/उपसर्ग को पूर्ण पथ से मिलाने की आवश्यकता है:

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

man findकहते हैं -Eका उपयोग करता है regex समर्थन देने


लगता है -EUbuntu (WSL Ubuntu पर परीक्षण किया) पर उपलब्ध नहीं है
जंगी चिंपांज़ी

2
@ कलेवर लिटिल मंकी - नहीं, स्वीकार किए गए जवाब को उबंटू पर काम करना चाहिए, यह भिन्नता मैक ओएस एक्स के लिए है विशेष रूप से (या शायद फ्रीबीएसडी की तरह एक और बीएसडी संस्करण)
स्टेन कुर्दिज़ेल

8

अपने स्ट्रिंग से बचने के लिए शेल से बचने के लिए सिंगल कोट्स (') का उपयोग करने का प्रयास करें। याद रखें कि अभिव्यक्ति को पूरे रास्ते से मेल खाना चाहिए, यानी देखने की जरूरत है:

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

इसके अलावा, ऐसा लगता है कि मेरा खोज (GNU 4.4.2) केवल मूल नियमित अभिव्यक्ति जानता है, विशेष रूप से {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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.