web-dev-qa-db-ja.com

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

lsがファイルタイプの列を表示できるかどうかについて私は知らない。

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

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

更新

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

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

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

この理由で、私は探している答えとして答えをマークしていません。

9
user10853

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

しかし、ファイルタイプlineではなく、ファイルタイプcolumnが必要なので、行間の改行文字を削除する方法を次に示します。

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" \;'
12
dessert

ファイルの種類を表示する最良の方法は、次のコマンドを使用することだと思います。

file <filename>

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

file *

<code>file *</code> sample from my computer

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

man file
8
singrium

わかりやすくするために、シンボルを追加する-Fフラグ(分類)を使用して、lsを使用して基本的な意味で ファイルタイプ を表示できることを指摘します。タイプに応じたファイル名へ:

‘-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's answer は、これをより詳細に説明しています。

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

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

そのためには、 singriumの答え が指摘するように、fileコマンドが必要です。このコマンドは、ファイルのコンテンツの最初の50-100kB程度を見て、タイプを決定します。

7
Zanna

ファイルタイプの1つの形式は、ファイルが通常のファイル、ディレクトリ、デバイス、シンボリックリンクなどであるかどうかです。lsは、オプション-lまたは-Fを使用してこれを表示できます。

  • オプション-lは、リストの最初にファイルタイプを1文字として表示します。例:

    $ 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
3
wjandrea