मैं निर्देशिका में निहित सभी फ़ाइल प्रकार कैसे दिखा सकता हूं?


12

क्या कोई कमांड है जो मुझे विशिष्ट निर्देशिका में बताती है कि किस प्रकार की फाइलें मौजूद हैं?

मैं जैसे कमांड का उपयोग करके फ़ाइल प्रकार का पता लगा सकता हूं od -c myfile | less

लेकिन मैं नहीं जानता कि यह कैसे एक निर्देशिका में सभी फ़ाइलों के लिए करना है।

जवाबों:


19

हालांकि od -cवास्तव में एक फ़ाइल की सामग्री को दिखाएगा, यह अपनी फ़ाइल प्रकार प्राप्त करने का एक अच्छा तरीका नहीं है। जबकि कुछ फ़ाइलों में फ़ाइल प्रकार के साथ एक हेडर होगा, सभी नहीं। एक बेहतर तरीका कमांड है file:

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

इसलिए, निर्देशिका में सभी फ़ाइल प्रकारों की सूची प्राप्त करने के लिए, आप यह कर सकते हैं:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

उदाहरण आउटपुट:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

व्याख्या

  • for file in dir/*; do ... done;: सब कुछ के माध्यम से पुनरावृति dir( dirयह सिर्फ एक उदाहरण है, आपको इसे उस वास्तविक निर्देशिका के नाम में बदलना चाहिए जिसे आप खोज करना चाहते हैं), बदले में प्रत्येक आइटम को सहेजना$file
  • file "$file": fileप्रत्येक आइटम पर चला।
  • cut -d: -f 2: केवल दूसरा फ़ील्ड (द्वारा परिभाषित फ़ील्ड :) प्रिंट करें
  • sed 's/^ //; s/ +/ /g' : लाइन की शुरुआत से रिक्त स्थान निकालें और लगातार रिक्त स्थान को एक ही स्थान में परिवर्तित करें।
  • sort -u : डुप्लिकेट फ़ाइल प्रकारों को हटा दें

धन्यवाद, लेकिन मैं बिल्कुल कॉपी और अतीत "dir / * में फ़ाइल के लिए"; फ़ाइल "$ फ़ाइल" | कटौती -d -f 2 | सॉर्ट -u; मेरे टर्मिनल में "किया" और मुझे "ERROR" मिला
मोहम्मद रजा रेजवानी

2
@ सबसे पहले, कृपया हमेशा प्राप्त होने वाली सटीक त्रुटि का उल्लेख करें, यह कहते हुए कि आपको "ERROR" बहुत उपयोगी नहीं है। किसी भी मामले में, त्रुटि शायद इसलिए है क्योंकि आपके पास कोई निर्देशिका नाम नहीं है dir/, जो कि सिर्फ एक उदाहरण का नाम था, आपको इसे एक वास्तविक निर्देशिका के नाम में बदलना होगा: for file in /home/alex/*; do ... doneउदाहरण के लिए।
टेराडॉन

धन्यवाद, अगर आपने मेरा गलत काम किया (... मुझे लगा कि dir कमांड है जैसे ls नहीं डायरेक्टरी -sorry- मैं भी आपके उत्तर को संपादित करना बेहतर समझता हूं) आप बस "ERROR" देखें और कुछ नहीं।
मोहम्मद रजा रेजवानी

अच्छी नौकरी, थैंक्स, लेकिन मैंने उदाहरण के लिए चार लाइन "ID3 संस्करण 2.3.0 के साथ ऑडियो फ़ाइल देखी, जिसमें" या एक से अधिक "आईएसओ मीडिया, एमपीईजी वी 4 सिस्टम, संस्करण 2" शामिल हैं। मुझे "डुप्लिकेट को हटाने" के बारे में निश्चित नहीं है।
मोहम्मद रजा रेजवानी

@alex मेला काफी, उत्तर संपादित आपको कोई डुप्लिकेट नहीं मिलना चाहिए। sort -uइन्हें निकाल देगा, लाइनों अलग होना चाहिए (वे भी रिक्त स्थान की एक अलग संख्या हो सकता है, कि उन्हें गैर-समान बनाता है)।
टेराडॉन

3

मैं शायद ऐसा कुछ करूंगा -

find . -type f -exec file {}  \;

वह वर्तमान पथ से फ़ाइलों के लिए खोज करेगा (उदाहरण के लिए कोई निर्देशिका नहीं) और फिर fileप्रत्येक फ़ाइल पर कमांड निष्पादित करें ।


1

इसे इस्तेमाल करे:

ls | xargs file -b | sort | uniq

यह काम किस प्रकार करता है:

ls : सूची निर्देशिका सामग्री

फ़ाइल-बी : फ़ाइल प्रकार का निर्धारण; उत्पादन लाइनों के लिए फ़ाइल नाम न दें

सॉर्ट : सॉर्ट लाइन्स

uniq : बार-बार लाइनों को छोड़ना



1
पार्सिंग से बचने के लिए आप file -b *इसके बजाय उपयोग कर सकते हैं । ls | xargs file -bls
वेजेंड्रिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.