文字で始まるすべてのファイルを一覧表示できますが、ディレクトリは一覧表示できませんか?

文字で始まるすべてのファイルを一覧表示できますが、ディレクトリは一覧表示できませんか?

私の宿題は、何らかの形でその文字で始まるすべてのファイルのリストを取得する必要があります。F、私は次のコマンドを知っています。

ls F*

しかし、ディレクトリも提供されます。実際のファイルのみを表示できますか?

答え1

POSIX的に:

find . ! -name . -prune -type f -name 'F*'

そしてzsh

print -rl -- F*(.)

答え2

find コマンドを使用できます。

find ./ -name "F*" -type f

-f タイプつまり、通常のファイルだけが必要であるという意味です。

答え3

もちろん - 使用findls従来のように名前がソートされていないため、これを追加しました。)

find . -type f -maxdepth 1 -name 'F*' |sort |xargs ls -l {} \;

または(名前のみを希望する場合)

find . -type f -maxdepth 1 -name 'F*' |sort

この-maxdepthオプションは使用できません。POSIX、しかし、でマークしたので、bashいくつかの仮定をすることができます。たとえば、次のような場合に動作します。OSX(人々が一般的に使用する他のプラットフォームbash)。

とにかく、何があってもサブfindディレクトリのファイルが表示されます。lsいいえ追加されない-Rオプション。

1つの問題findは、出力に印刷できない文字(スペースなど)を含むファイル名を含めることができることです。 LinuxとOSXの両方findで利用可能拡大する(POSIXではない)が呼び出され、-print0次に適用されます。xargs補完的な拡張-0。だからあなたはできるこれを行う:

find . -type f -maxdepth 1 -print0 -name 'F*'  |sort -z |xargs -0 ls -l {} \;

あるいは、(ソート機能を放棄したい場合)、POSIXを直接使用することもできます。

find . -type f -maxdepth 1 -name 'F*' -exec ls -l {} +

ソートは詳細なリストが必要な場合に主に問題になりますが、POSIXは+名前リストの(まだ正当な)改行はソートを妨げるので、ソートされたリストが必要な場合は役に立ちません。

おじさんPOSIXには次のオプションがあることを指摘してください-prune

-prune
デフォルトは常にtrueと評価する必要があります。ディレクトリの場合、findは現在のパス名の下に移動しません。

findここに示すように引数に "."を使用する場合は、このオプションは必要ありません-maxdepth。事実ですが、さらに一歩一歩ならばls「.」は同じですls -aが、OPの質問を厳密に一致させると、「-a」オプションが削除され、引数はfind「*」になる可能性があります。しかし(参考としておじさん)、-prune次にのみ適用されます。目次find * -pruneディレクトリの内容と一致します。

たとえば、シェルワイルドカード拡張を使用することもできます。

for n in F*;do [ -f "$n" ] && echo "$n"; done

ls F*これは、印刷されない文字を疑問符に変換しないので(おそらく)望ましい。したがって、ワイルドカード拡張はどちらの場合もコマンド長制限に達します。

最終的に答えはOPが欲しいかどうかによって異なります。チェックリストまたはリスト名前。しかし、どちらの場合も、それ自体は何もlsしません。

関連情報