Lsを使用してディレクトリ内のファイルを一覧表示し、さまざまなオプションを渡そうとしています。
ファイルの種類を一覧表示する機能もありますか?個々のファイルに対してfileコマンドを実行せずに、実行可能ファイル、sharedlibs、または単にASCIIファイルのどれであるかを知りたいです。
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 -
うまくいくだろう。
ls
はこれを行いません。その仕事は、ファイルの内容ではなく、ファイルのメタデータ(権限、タイムスタンプなど)について報告することです。しかし、file
自体はそうします(すべてのファイルをリストするためにシェルワイルドカードと組み合わせる):
file *
現在のディレクトリの場合、または
file /some/directory/*
別のディレクトリにあります。
メタデータとファイルコンテンツ情報を組み合わせる場合は、ls
とfile
の出力を組み合わせることができます。 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'