lsでファイルタイプを表示するにはどうすればよいですか?


12

lsファイルタイプ列を表示できるかどうかについては、私は無知です。

クイックオンライン検索を実行してを検索しても、manそのような機能は明らかになりませんでした。これは可能ですか?

明確化:これは、ファイルに拡張子がない場合に特に役立ちます。

更新

2018-04-28現在、回答は非常に興味深いものでしたが、私が探していたものは提供されませんでした。すなわち、

  • file実際のファイルタイプを提供しますが、とうまく統合できませんls。具体的には、ls -lhtrpG --group-directories-first --color=always

  • ls -Flsソリューションですが、実際のファイルタイプの列ではなくシンボルを提供します。

このため、私が探している回答として、どの回答にもマークを付けていません。



関連情報::人間が読めるためls -lahtrpF --group-directories-first --color=always /devls -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

ただし、filetype ではなくfiletype が必要な場合は、行間の改行文字を削除する方法を次に示します。

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
エイリアスの代わりに関数を使用する場合、それは引用の地獄のようなものではなくなり、pasteorまたはを使用する場合column、より適切な配置が得られる可能性がlsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }あります。サイズと日付が類似しているため、配置の問題は回答で明らかではありません。(コマンドはファイルごとに1回ではなく、呼び出される回数が少ないため、これもわずかに速くなります。)
muru

@muruたくさんの良い提案をありがとう!このcolumnアプローチはあなたのために働きますか?それだけの出力印刷しls -l、すべてのファイルに対しては、続くfileシェルだけでどうなるかのように、私のためにすべてのファイルのための出力ls -l "$@"; file -b "$@" | cut -d, -f1...
デザート

します。paste.ubuntu.com/p/KjPthXPDPb-上部はエイリアスから、下部は関数で、どちらもから実行され/etcます。
muru

私は問題があると思います- columnの出力が端末でない場合は、列数を指定する必要があります。そうしないと、ファイルが次々に出力されます。column -c "$COLUMNS" ...どちらの場合でも動作するはずです。
muru

ファイルごとに(少なくとも?)5つのプロセスを起動しているので、ディレクトリに多数のファイルがある場合、これはおそらく遅くなります...
JanC

10

ファイルタイプを表示する最良の方法は、次のコマンドを使用することです。

file <filename>

ディレクトリ内のすべてのファイルのタイプを一覧表示する場合は、次のように使用します。

file *

コンピュータからの<code> file * </ code>サンプル

引数の詳細については、以下を参照してください。

man file

この回答はOPの質問に直接応答しませんが、ファイルのMIMEタイプを見つける正しい方法を示しており、正しい回答としてマークする必要があります。mime typeのみを取得するには、次を使用しますfile --mime-type filename
ペドロロビト

@PedroLobito 密接に関連する質問fileかなりカバーしていると思いますが、この質問は異なります。
デザート

あなたが最初にfile答えたので、私はこの答えに投票します。他の人に返信したので、これは十分ではありません(lsと統合する必要があります)。ありがとうございました。
user10853

1
ファイル*が最良の答えです
トラマダ

1
file --mime /dev/*現在のディレクトリではなくディレクトリ/ devのリストMIMEの場合
user1742529

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ただし、の出力の最初の文字では、情報が少し不可解に表示されていることがわかります。wjandreaの回答では、これについて詳しく説明しています。

しかし、私はこれがあなたがファイルタイプによって意味するものだとは思いません。ls唯一のディレクトリ一覧(ストアのファイル名)と(前述の意味での「タイプ」を含むメタデータを格納する、)、iノードで-コマンドは、通常のファイルの中を見ていません。

そのため、lsコマンドは、JPG画像、バイナリファイル、テキストファイル、または何らかの種類のLibreOfficeドキュメントであるという意味で、ファイルタイプを表示できません。その情報がないためです。

そのため、singriumの回答が指摘するfileように、ファイルのコンテンツの最初の50〜100kB程度を調べてタイプを判別するコマンドが必要です。


@Zanaこのフラグに注目していただきありがとうございます。私が探していたもの(実際のファイルタイプ)ではありませんが、今のところこれで十分です。このために私はそれを投票します。
user10853

3

ファイルタイプの1つの形式は、ファイルが通常のファイルであるかどうか、ディレクトリ、デバイス、シンボリックリンクなどで、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.