私はlsを使ってディレクトリ内のファイルをリストし、他のオプションを渡そうとしました。
ファイル形式を一覧表示する機能もありますか?個々のファイルに対してfileコマンドを実行せずに、実行可能ファイル、共有ライブラリファイル、またはASCIIファイルが何であるかを知りたいです。
答え1
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 -
動作します。
答え2
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'