私の宿題は、何らかの形でその文字で始まるすべてのファイルのリストを取得する必要があります。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
もちろん - 使用find
(ls
従来のように名前がソートされていないため、これを追加しました。)
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
しません。