web-dev-qa-db-ja.com

実行可能ファイル、ASCIIなどのファイルタイプを確認できるように、ターミナルでファイルを一覧表示するにはどうすればよいですか?

Lsを使用してディレクトリ内のファイルを一覧表示し、さまざまなオプションを渡そうとしています。

ファイルの種類を一覧表示する機能もありますか?個々のファイルに対してfileコマンドを実行せずに、実行可能ファイル、sharedlibs、または単にASCIIファイルのどれであるかを知りたいです。

3
Ahmed

ls自体はこの情報を表示しません。

次のように、findの出力をfile -f -にパイプできます。

$ find /usr/local/bin | file -f -
/usr/local/bin:              directory 
/usr/local/bin/apt:                  Python script, ASCII text executable
/usr/local/bin/mint-md5sum:                          ASCII text
/usr/local/bin/search:                     Bourne-Again Shell script, ASCII text executable
/usr/local/bin/gnome-help:                         Python script, ASCII text executable
/usr/local/bin/office-vb.sh:                           ASCII text
/usr/local/bin/Pastebin:                       Python script, ASCII text executable
/usr/local/bin/highlight:                        POSIX Shell script, ASCII text executable
/usr/local/bin/Yelp:                   Python script, ASCII text executable

フルパスを出力するため、findの代わりにlsが使用されますが、lsはファイル名のみを出力することに注意してください。したがって、現在のディレクトリ内のファイルでこれを行う必要がある場合は、次のようにします。

ls | file -f -

うまくいくだろう。

3
garethTheRed

lsはこれを行いません。その仕事は、ファイルの内容ではなく、ファイルのメタデータ(権限、タイムスタンプなど)について報告することです。しかし、file自体はそうします(すべてのファイルをリストするためにシェルワイルドカードと組み合わせる):

file *

現在のディレクトリの場合、または

file /some/directory/*

別のディレクトリにあります。

メタデータとファイルコンテンツ情報を組み合わせる場合は、lsfileの出力を組み合わせることができます。 1つの方法は、2つのコマンドを配置して、1行に1つのファイルを同じ順序でリストし、 paste ユーティリティを使用してそれらを結合することです。

paste <(ls -dlog -- *) <(file -b -- *)

(これは、一般的な対話型シェルで利用可能なプロセス置換を使用します:bash、zsh、ksh93でも使用できます。) column ユーティリティがある場合は、列を整列する便利な方法です。 :

paste <(ls -dlog -- *) <(file -b -- *) | column -ts $'\t'

フィールドを別の順序で出力する場合は、代わりにファイル名のフィールド join 。スペースを含むファイル名に対処し、垂直方向に整列した結果を生成するために、スペースとタブの間を少し行き来します。

join -t $'\t' -1 2 -2 1 <(ls -dlog -- * |
                          sed 's/^\([^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\)  */\1\t/') \
                        <(file -- * | sed 's/: */\t/') |
column -ts $'\t'