फ़ाइल प्रकार द्वारा फ़ाइलें कैसे खोजें?


9

मैं जानता हूँ कि मैं का उपयोग करके फ़ाइलें पा सकते हैं find: find . -type f -name 'sunrise'। उदाहरण परिणाम:

./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise

मुझे यह भी पता है कि मैं फ़ाइल का फ़ाइल प्रकार निर्धारित कर सकता हूँ file sunrise:। उदाहरण परिणाम:

sunrise: PEM RSA private key

लेकिन मैं फ़ाइल प्रकारों द्वारा फाइलें कैसे पा सकता हूं?

उदाहरण के लिए my-find . -type f -name 'sunrise' -filetype=bash-script:

./astronomy/sunrise
./schedule/sunrise

1
--filetypeखोज आदेश या कुछ और के लिए कोई विकल्प नहीं है जो आपको फ़ाइल का प्रकार बताएगा। केवल एक चीज जो आप कर सकते हैं वह है उपयोग करें --exec file {} \;और फिर इसे पाइप करें grep Bourneयदि आप बैश स्क्रिप्ट grep Perlकी तलाश में थे या यदि आप पर्ल स्क्रिप्ट या उन लाइनों के साथ कुछ ढूंढ रहे थे।
नासिर रिले

जवाबों:


13

एक यूनिक्स प्रणाली पर "फ़ाइल प्रकार" नियमित फाइलें, निर्देशिका, नामित पाइप, चरित्र विशेष फाइलें, प्रतीकात्मक लिंक आदि जैसी चीजें हैं। ये प्रकार की फाइलें हैं जो findइसके -typeविकल्प के साथ फ़िल्टर कर सकती हैं ।

findउपयोगिता अपने आप में एक "खोल स्क्रिप्ट", "JPEG छवि फ़ाइल" या किसी अन्य के बीच नहीं भेद से कर सकते हैं नियमित रूप से फ़ाइल के प्रकार । इस प्रकार के डेटा को हालांकि fileउपयोगिता से अलग किया जा सकता है , जो अपने प्रकार को निर्धारित करने के लिए फाइलों के भीतर विशेष हस्ताक्षर देखता है।

विभिन्न प्रकार की डेटा फ़ाइलों को लेबल करने का एक सामान्य तरीका उनके MIME प्रकार से है , और fileMIME प्रकार की फ़ाइल को निर्धारित करने में सक्षम है।


का प्रयोग fileके साथ findनियमित रूप से फ़ाइलों की MIME प्रकार, और उपयोग करने के लिए कि केवल शेल स्क्रिप्ट को खोजने पता लगाने के लिए:

find . -type f -exec sh -c '
    case $( file -bi "$1" ) in
        */x-shellscript*) exit 0
    esac
    exit 1' sh {} ';' -print

या, का उपयोग कर bash,

find . -type f \
    -exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
    -print

यदि आप केवल उस नाम के साथ स्क्रिप्ट का पता लगाना चाहते हैं तो -name sunriseपहले जोड़ें -exec

findआदेश ऊपर में या वर्तमान निर्देशिका के नीचे सभी नियमित फ़ाइलों मिलेगा, और ऐसे प्रत्येक फ़ाइल कॉल के लिए एक छोटी लाइन खोल स्क्रिप्ट। यह स्क्रिप्ट file -biमिली हुई फ़ाइल पर चलती है और शून्य निकास स्थिति के साथ बाहर निकलती है यदि उस कमांड के आउटपुट में स्ट्रिंग है /x-shellscript। यदि आउटपुट में वह स्ट्रिंग नहीं है, तो यह एक गैर-शून्य निकास स्थिति के साथ बाहर निकलता है जो findअगले फ़ाइल के साथ तुरंत जारी रखने का कारण बनता है। यदि फ़ाइल को शेल स्क्रिप्ट के रूप में पाया गया, तो findकमांड फ़ाइल के पाथनाम ( -printअंत में, जिसे कुछ अन्य क्रिया द्वारा भी बदला जा सकता है) को आउटपुट करने के लिए आगे बढ़ेगा ।

file -biआदेश इच्छा आउटपुट फ़ाइल के MIME प्रकार। लिनक्स (और अधिकांश अन्य प्रणालियों) पर एक शेल स्क्रिप्ट के लिए, यह कुछ इस तरह होगा

text/x-shellscript; charset=us-ascii

fileउपयोगिता के थोड़े पुराने संस्करण वाले सिस्टम पर , यह हो सकता है

application/x-shellscript

सामान्य बिट /x-shellscriptसबस्ट्रिंग है।

ध्यान दें कि MacOS पर, आप का उपयोग करना होगा file -bIके बजाय file -biवजह से कारणों ( -iविकल्प कुछ अलग करता है)। MacOS पर आउटपुट लिनक्स सिस्टम के समान है।


क्या आप प्रत्येक पाए गए शेल स्क्रिप्ट पर कुछ कस्टम क्रिया करना चाहते हैं, आप ऐसा ऊपर की आज्ञाओं के -execस्थान पर दूसरे के साथ कर सकते हैं , लेकिन यह भी करना संभव होगा-printfind

find . -type f -exec sh -c '
    for pathname do
        case $( file -bi "$pathname" ) in
            */x-shellscript*) ;;
            *) continue
        esac

        # some code here that acts on "$pathname"

    done' sh {} +

या, के साथ bash,

find . -type f -exec bash -c '
    for pathname do
        [[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue

        # some code here that acts on "$pathname"

    done' bash {} +

सम्बंधित:


1

आप findप्रत्येक मिली फ़ाइल पर निष्पादित कर सकते हैं और फिर उस परिणाम के लिए grep कर सकते हैं जिसमें आप रुचि रखते हैं।

# When looking for ASCII Text
find . -type -exec file {} \; | grep "ASCII"
# or for MS Word Documents
find . -type f -exec file {} \; | grep "Microsoft Word"

मेरा सुझाव है कि झूठे सकारात्मक मैचों की संख्या कम रखने के लिए आपकी अपेक्षा के अनुरूप खोज पैटर्न को करीब से बनाया जाए।

खबरदार कि उनके फ़ाइल नाम में नई सुर्खियों वाली फाइलें इस दृष्टिकोण के साथ समस्या पैदा कर सकती हैं।


0

का उपयोग करते हुए perlकी File::LibMagicमॉड्यूल:

perl -MFile::LibMagic=:easy -MFile::Find -le '
  find sub {
    print $File::Find::name if
      $_ eq "sunrise" and
      -f and
      MagicFile$_ eq "PEM RSA private key"
  }, @ARGV' -- .
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.