मैं कैसे एलएस के साथ filetype प्रदर्शित करते हैं?


12

मैं इस बात से अनभिज्ञ हूं कि क्या lsएक फाइल कॉलम कॉलम प्रदर्शित करने में सक्षम है।

त्वरित ऑनलाइन खोज करने और खोज manकरने से ऐसी क्षमता का पता नहीं चला। क्या यह ऐसा करने में सक्षम है?

स्पष्टता: यह विशेष रूप से उपयोगी है यदि फ़ाइलों में एक्सटेंशन नहीं है।

अपडेट करें

2018-04-28 तक उत्तर काफी दिलचस्प रहे हैं लेकिन उन्होंने यह नहीं बताया कि मैं क्या देख रहा था। अधिक विशेष रूप से,

  • fileवास्तविक फ़िलिप्प्स देता है, लेकिन यह अच्छी तरह से एकीकृत नहीं करता है ls। विशेष रूप से, मैं उपयोग करता हूंls -lhtrpG --group-directories-first --color=always

  • ls -Flsहालांकि यह एक समाधान है जो प्रतीकों को वास्तविक फाइलपेट्स का एक स्तंभ प्रदान नहीं करता है।

इस कारण मैंने किसी भी उत्तर को चिह्नित नहीं किया है क्योंकि मैं जिस उत्तर की तलाश कर रहा हूं।



संबंधित जानकारी: मानव पठनीय के लिए: ls -lahtrpF --group-directories-first --color=always /devया ls -lsahG /dev, और पठनीय कार्यक्रम के लिए ls -lsa /dev। देख man lsजानकारी के लिए प्रलेखन।
user1742529

जवाबों:


16

fileफ़ाइल प्रकार की जानकारी पाने के लिए निश्चित रूप से सही विकल्प है। इसके उत्पादन को संयोजित करने के लिए lsमैं इसका उपयोग करने का सुझाव देता हूं find:

find -maxdepth 1 -type f -ls -exec file -b {} \;

यह वर्तमान डायरेक्टरी में हर फाइल को ढूँढता है और आउटपुट के ls -dilsसाथ-साथ इसके लिए आउटपुट भी प्रिंट करता file -bहै, प्रत्येक एक लाइन पर। उदाहरण आउटपुट:

  2757145      4 -rw-rw-r--   1 dessert dessert      914 Apr 26 14:02 ./some.html
HTML document, ASCII text
  2757135      4 -rw-rw-r--   1 dessert dessert      201 Apr 13 15:26 ./a_text_file
UTF-8 Unicode text, with CRLF, LF line terminators

लेकिन, जैसा कि आप एक फाइल टाइप लाइन नहीं, बल्कि एक फाइल टाइप कॉलम चाहते हैं , यहां लाइनों के बीच न्यूलाइन कैरेक्टर से छुटकारा पाने का एक तरीका है:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {}" \;

नमूना उत्पादन:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document, ASCII text
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text, with CRLF, LF line terminators

वह नया स्तंभ काफी लंबा है, इसलिए पहले कोमा से सब कुछ काट दें:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {} | cut -d, -f1" \;

इसका उत्पादन इस तरह दिखता है:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text

यह काफी काम नहीं है, तो कैसे के बारे में alias? आपकी ~/.bash_aliasesफ़ाइल में निम्न पंक्ति के साथ आपको lsfवर्तमान निर्देशिका के लिए उपरोक्त आउटपुट प्राप्त करने के लिए बस चलाने की आवश्यकता है ।

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'

1
यदि आप एक उपनाम के बजाय एक फ़ंक्शन का उपयोग करते हैं, तो यह एक उद्धृत नरक से कम होगा, और यदि आप उपयोग करते हैं pasteया column, तो आप बेहतर संरेखण प्राप्त कर सकते हैं: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }समान आकार और तिथियों के कारण संरेखण मुद्दा उत्तर में स्पष्ट नहीं है। (यह भी थोड़ा तेज़ होगा, क्योंकि कमांड को एक बार प्रति फ़ाइल के बजाय कम बार लागू किया जाएगा।)
मुरु

@ ममरू कई अच्छे सुझावों के लिए धन्यवाद! क्या यह columnaproach आपके लिए काम करता है ? यह सिर्फ मेरे लिए हर फ़ाइल के लिए आउटपुट के ls -lबाद हर फाइल के आउटपुट को प्रिंट करता fileहै, जैसे कि शेल बस करेगा ls -l "$@"; file -b "$@" | cut -d, -f1...
मिठाई

ऐसा होता है। paste.ubuntu.com/p/KjPthXPDPb - सबसे ऊपर का हिस्सा उपनाम से है और नीचे का हिस्सा फंक्शन का है, दोनों ही रन करते हैं /etc
मूरू

मुझे लगता है कि मुझे समस्या दिखाई देती है - अगर columnआउटपुट टर्मिनल के लिए नहीं है, तो आपको कॉलम की गिनती निर्दिष्ट करने की आवश्यकता है या यह फाइलों को एक के बाद एक आउटपुट करेगा; इसलिए column -c "$COLUMNS" ...दोनों मामलों में काम करना चाहिए।
मूरू

आप प्रत्येक फ़ाइल के लिए (कम से कम?) 5 प्रक्रियाएं शुरू कर रहे हैं, इसलिए यह संभवत: तब धीमी होगी जब किसी निर्देशिका में बहुत सारी फाइलें हों ...
JanC

10

मुझे लगता है कि फ़ाइल प्रकार प्रदर्शित करने का सबसे अच्छा तरीका इस कमांड का उपयोग करना है:

file <filename>

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

file *

मेरे कंप्यूटर से <code> फ़ाइल * </ code> नमूना

तर्कों के बारे में अधिक जानकारी के लिए, देखें:

man file

हालांकि यह उत्तर सीधे ओपी के प्रश्न का उत्तर नहीं देता है, यह फ़ाइल के माइम प्रकार को खोजने का सही तरीका दिखाता है और इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। mime typeएकमात्र पाने के लिए , का उपयोग करें file --mime-type filename:।
CONvid19

@PedroLobito मुझे लगता है कि बारीकी से संबंधित प्रश्नfile काफी अच्छी तरह से शामिल है, लेकिन यह सवाल अलग है।
मिठाई

मैं इस जवाब को वोट देता हूं कि आप fileजवाब देने वाले पहले व्यक्ति थे । जैसा कि मैंने दूसरों को जवाब दिया कि यह पर्याप्त नहीं है (इसे ls के साथ एकीकृत करने की आवश्यकता है) इसलिए मैं इसे एक वोट पर रखता हूं। धन्यवाद।
user10853

1
file * सबसे अच्छा जवाब है
tramada

1
file --mime /dev/*वर्तमान / उपयोगकर्ता के बजाय निर्देशिका में
देवों के

7

स्पष्टता के लिए, मैं यह इंगित करने जा रहा हूं कि आप ध्वज (वर्गीकृत) का उपयोग करके फ़ाइल प्रकार को मूल अर्थ में देख सकते हैं ls, -Fजो इसके प्रकार के आधार पर फ़ाइलनाम में एक प्रतीक जोड़ता है:

‘-F’
‘--classify’
‘--indicator-style=classify’
     Append a character to each file name indicating the file type.
     Also, for regular files that are executable, append ‘*’.  The file
     type indicators are ‘/’ for directories, ‘@’ for symbolic links,
     ‘|’ for FIFOs, ‘=’ for sockets, ‘>’ for doors, and nothing for
     regular files.

आप उस जानकारी को आउटपुट के पहले अक्षर में थोड़ा कम क्रिप्टोकरेंसी में देख सकते हैं ls -l, हालाँकि। वेजेंड्रिया के उत्तर में इस पर अधिक विस्तार से वर्णन किया गया है।

लेकिन मुझे नहीं लगता कि फ़ाइल प्रकार से आपका यही मतलब है। lsकेवल निर्देशिका लिस्टिंग पर (जो दुकान फ़ाइल नाम) और inodes (जो "प्रकार" भावना जैसा कि पहले उल्लेख सहित दुकान मेटाडाटा,) - आदेश के अंदर नियमित फ़ाइलें नहीं लगती है।

इसलिए, lsकमांड फ़ाइल प्रकार को इस अर्थ में नहीं दिखा सकता है कि यह JPG छवि है या एक बाइनरी फ़ाइल या एक पाठ फ़ाइल या किसी प्रकार का LibreOffice दस्तावेज़ है, क्योंकि इसमें वह जानकारी नहीं है।

उसके लिए, जैसा कि सिंगरिउम का उत्तर बताता है, आपको fileकमांड की आवश्यकता है , जो कि उनके प्रकार को निर्धारित करने के लिए पहले 50-100kB या फ़ाइलों की सामग्री को देखता है।


@Zana इस ध्वज पर मेरा ध्यान आकर्षित करने के लिए धन्यवाद। यह अब के लिए यह करना होगा, हालांकि यह वह नहीं है जो मैं देख रहा था (वास्तविक फाइलपेट)। इसके लिए मैं इसे वोट करूंगा।
user10853

3

फ़िलाटाइप का एक रूप यह है कि क्या कोई फ़ाइल एक नियमित फ़ाइल है, निर्देशिका, डिवाइस, सिमलिंक, आदि lsयह विकल्प का उपयोग करके दिखा सकती है -lया -F

  • विकल्प -lएक सूची की शुरुआत में एक एकल चरित्र के रूप में फ़ाइल का आकार दिखाएगा, उदाहरण के लिए:

    $ ls -l
    drwxrwxr-x 2 user user 4096 Dec 11 00:18 DIR
    -rw-rw-r-- 1 user user    0 Dec 11 00:18 FILE
    lrwxrwxrwx 1 user user    4 Dec 11 00:19 LINK -> FILE
    

    जहाँ -एक नियमित फ़ाइल है, dएक निर्देशिका है, और lएक सिमलिंक है।

  • विकल्प -Fफिलेटाइप को प्रत्यय के रूप में दिखाएगा, उदाहरण के लिए:

    $ ls -F
    DIR/ FILE LINK@
    

    जहाँ कोई प्रत्यय एक नियमित फ़ाइल नहीं है, /एक निर्देशिका है, और @एक सिम्लिंक है।

इन पर अधिक जानकारी उपलब्ध है info coreutils 'ls invocation', यहाँ संक्षेप में प्रस्तुत है:

के लिए -l:

‘-’ regular file
‘b’ block special file
‘c’ character special file
‘C’ high performance (“contiguous data”) file
‘d’ directory
‘D’ door (Solaris 2.5 and up)
‘l’ symbolic link
‘M’ off-line (“migrated”) file (Cray DMF)
‘n’ network special file (HP-UX)
‘p’ FIFO (named pipe)
‘P’ port (Solaris 10 and up)
‘s’ socket
‘?’ some other file type

के लिए -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.