मैं ऐसी सभी फाइलें कैसे पा सकता हूं जिनमें टेक्स्ट स्ट्रिंग नहीं है?


40

पाठ फ़ाइलों को शामिल नहीं करने वाली सभी फ़ाइलों को खोजने के लिए मैं किस संक्षिप्त आदेश का उपयोग कर सकता हूं?

मैंने इसे आज़माया (-v का उपयोग करते हुए grep के मापदंडों को पलटने के लिए) बिना किसी भाग्य के:

find . -exec grep -v -l shared.php {} \;

किसी ने कहा कि यह काम करेगा:

find . ! -exec grep -l shared.php {} \;

लेकिन यह मेरे लिए काम नहीं करता है।

इस पृष्ठ का यह उदाहरण है:

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

लेकिन वह बोझिल है और बिल्कुल भी नहीं।

पीएस: मुझे पता है कि यह grep -L *करेगा, लेकिन मैं बाहर निकाले गए फ़ाइलों के साथ grep के संयोजन में खोज कमांड का उपयोग कैसे कर सकता हूं, जो मैं वास्तव में जानना चाहता हूं।

pss: इसके अलावा, मुझे यकीन नहीं है कि कैसे grep को grep -L *सिंटैक्स के साथ उपनिर्देशिका शामिल करना है, लेकिन मैं अभी भी जानना चाहता हूं कि कैसे उपयोग करना है find:)


1
आपके द्वारा लिखा गया पहला कमांड मेरे कंप्यूटर पर ठीक काम करता है। आप किस संस्करण का उपयोग कर रहे हैं? और जब से हम उस पर हैं, शायद निर्दिष्ट करें कि आप कौन से यूनिक्स चला रहे हैं ..
rahmu

@rahmu, यह कमांड लगभग हमेशा काम नहीं करता है जैसा कि आप उम्मीद करते हैं। आपके पास शायद एक बहुत विशिष्ट मामला है। कृपया देखें unix.stackexchange.com/questions/339619/…
sgnsajgon

जवाबों:


8
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

या

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

यहां हम -cएक फ़ाइल में मिलान लाइनों की संख्या (उपयोग करके ) की गणना कर रहे हैं यदि गिनती 0 है तो इसकी आवश्यक फ़ाइल है, इसलिए हम आउटपुट से पहला कॉलम यानी फ़ाइल नाम काटते हैं।


6
यह भयानक रूप से जटिल है। केविन का जवाब देखें ।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स हां मैं आपसे सहमत हूं। मेरे पास उसका जवाब +1 है।
सचिन दिवेकर

6
यह न केवल "भयानक रूप से जटिल" है, बल्कि गलत भी है क्योंकि यह उन सभी फाइलों को भी सूचीबद्ध करेगा जिनमें पैटर्न से मेल खाते हुए 10 से अधिक लाइनें हैं। यहां तक ​​कि अगर यह grepतय किया गया था कि यह अभी भी कोई फ़ाइल नाम युक्त :या newline वर्ण नहीं
मानेंगे

@don_crissti, उल्लेख करने के लिए धन्यवाद! फिर भी, जब तक आप बहुत सारे कॉपी-पेस्ट कोड का उपयोग नहीं करते हैं, तब तक उपरोक्त समाधान एक अच्छा अच्छा चालबाज़ है।
यूफोस

@ यूफोस - मुझे वास्तव में आपकी टिप्पणी नहीं मिली ... यह गलत है । वैसे भी, अगर आप इसे "वास्तव में एक अच्छा नौटंकी" की तरह लग रहा है, तो इसका उपयोग करने के लिए स्वतंत्र महसूस करें ...
don_crissti

57

यदि आप परिवर्तित करते हैं तो आपकी खोज को काम करना चाहिए -v -l(ऐसी फाइलें जिनका मिलान करने के लिए कोई रेखा नहीं है) -L(बिना लाइनों के मिलान वाली फ़ाइलें), लेकिन आप भी grepपुनरावर्ती ( -r) विकल्प का उपयोग कर सकते हैं :

grep -rL shared.php .

कौन सा काम करना चाहिए?
cwd

@ केविन - क्षमा करें, find . -exec grep -v -l shared.php {} \;(और मेरे द्वारा किए गए अन्य सभी प्रकार) मेरे लिए काम नहीं कर रहे हैं। मैं ओएस एक्स पर हूं, लेकिन मुझे नहीं लगता कि इससे कोई फर्क नहीं पड़ता। मैंने आपको +1 दिया क्योंकि मैं -rविकल्प के बारे में भूल गया था ।
cwd

@cwd मुझे पता है कि यह पुराना है, लेकिन मैं इसे भविष्य के पाठकों के लिए यहां छोड़ना चाहता हूं: तथ्य यह है कि आप ओएस एक्स पर हैं इससे फर्क पड़ता है। मैक OSX FreeBSD कमांड का उपयोग करता है। ज्यादातर लोग यहां लिनक्स (GNU) स्टाइल कमांड मानते हैं। उनके पास अलग-अलग तर्क हैं, विवरणों को संभालने के विभिन्न तरीके हैं।
रिच होमोलका

2016 के रूप में OSX समर्थन करने के लिए प्रकट होता है-L
डेविड मोल्स

मैंने कहा कि यह नहीं है, यह नहीं है। :) ऐसा नहीं है कि किसी ने स्पष्ट रूप से यह नहीं कहा, लेकिन टिप्पणियां भ्रमित थीं (और मैं निश्चित रूप से अन्य ओएस एक्स / बीएसडी बनाम जीएनयू में चला गया हूं)।
डेविड मोल्स

4

मुझे पता है कि यह grep -L *करेगा, लेकिन मैं फ़ाइलों को बाहर करने के लिए findसंयोजन के साथ कमांड का उपयोग कैसे कर सकता हूं grepजो मैं वास्तव में जानना चाहता हूं

आप इसका उपयोग कर सकते हैं findऔर इसे grepपसंद कर सकते हैं :

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

यहां -printकेवल तभी निष्पादित किया जाता है यदि पिछली अभिव्यक्ति: के ! -exec ... {}रूप में मूल्यांकन करता है true
इसलिए मिली प्रत्येक फ़ाइल के लिए, grep -q 'PATTERN'यह कहा जाता है exec, यदि परिणाम falseतब संपूर्ण अभिव्यक्ति का ! -exec grep -q 'PATTERN'मूल्यांकन करता है trueऔर फ़ाइल का नाम printएड है।


2
यह एक मानक और पोर्टेबल होने का लाभ है।
स्टीफन चेज़लस

जीएनयू के साथ grep -Lहालांकि इसमें कोई अंतर है कि यह सूची में गैर-पठनीय फ़ाइलों को भी शामिल करेगा।
स्टीफन चेजलस

1

आपको विकल्प -L द्वारा मिलान परिणाम नहीं मिल रहा है

grep -iL shared.php .

-1

मुझे लगता है कि आप एक कमांड की तरह देख रहे हैं

find . -type f -execdir grep -q -v shared.php {} \; -print

विकल्प छोड़ -qदेता है grepऔर उपयोग करने के बाद -execdirआपको -printपाया फ़ाइलों को प्रिंट करने की आवश्यकता होती है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.