次のような典型的なビジネスPCの状況があるとします。
drwxr-xr-x 1 whatever whoever 3 Oct 3 16:40 invoices2009
drwxr-xr-x 1 whatever whoever 4 Oct 3 16:40 invoices2010
drwxr-xr-x 1 whatever whoever 2 Oct 3 16:40 invoices2011
-rwxr-xr-x 1 whatever whoever 440575 Oct 3 16:40 tax2010_1
-rwxr-xr-x 1 whatever whoever 461762 Oct 3 16:40 tax2010_2
-rwxr-xr-x 1 whatever whoever 609123 Oct 3 16:40 tax2010_3
次に、怠惰にして、次のように入力します。
$ ls -l *2010*
isがinvoices2010ディレクトリにあるとすると、期待どおりに動作しません。 ディレクトリ名には201年も含まれているため、ls
はinvoices201にもファイルを一覧表示しますが、現在のディレクトリにあるものを一覧表示します。さらにおかしなことに、tax2010 *ファイルがまったく存在せず、例のように3つのディレクトリではなく、50個あると想像してください。はい、試してみました:ls
はindicateでもありません。どのファイルがどのディレクトリにあるかはわかりませんが、すべてのファイルが現在のディレクトリにあるかのように、トップダウンで一覧表示します。 (-R
オプションを明示的に指定しない限り、確かに知っています)
さらに、find
でもこれを実行できることを知っていますが、単純なls
ワンライナーでこのタスクを実行する方法もあります(明らかに、はるかに少ない複雑な構文)?
あなたの質問は、「ls
のみでディレクトリを除外するパターンでファイルを一覧表示する方法」のようです。
純粋なls
でそれを行う方法はありません。次のようにls
+ grep
を組み合わせることができます。
ls -ld *2010* | grep -v '^d'
ただし、そのためにはfind
を使用する方がはるかに優れています。
find . -maxdepth 1 -type f -name "*2010*"
ls
のみを使用してディレクトリを選択的にフィルタリングすることはできません。 Rush's answer で説明されているように、find
またはls | grep
が必要です。しかし、あなたの具体的な例として、あなたが尋ねた質問に答えるには あなたのコメント :
繰り返しますが、現在のディレクトリにあるtax *ファイルを一覧表示したいのですが、同じ作業ディレクトリに存在し、指定された2010ワイルドカードにも一致するディレクトリ「invoices2010」リストではパターンをスキップする必要があります。
できるよ
ls -l --ignore='invoices*' *tax2010*
ignore
シェルパターンに一致するものはすべて除外されます。
ls -dlp *2010*
はソリューションの良いスタートですが、出力をどのようにしたいかによって異なります。
grep
に対してls
を行わない理由はありますが、無視しても問題ありません。 ls
コマンドを入力配列として使用し、grep
にパイプされた各エントリでls -ld
を呼び出して、出力がnullに送信されたディレクトリを除外し、成功した場合は元の入力をエコーします。
for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ;
同じ結果であるgrepと条件付き出力を反転できます。
for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ;
編集:私の悪い、これはパターン一致なしで機能しますが、上記のOPのようにワイルドカード検索を追加すると、およびパターンに一致するディレクトリがあり、出力にはシステムメッセージが含まれるため、ファイルリストだけを取得するには、さらにフィルタリングする必要があります。
再度編集:/ dev/nullのバックスラッシュを修正しました。
Lsでgrepを使用しないでください。
Bashでは、名前に「2010」が含まれているが番号で開始されていないファイルを表示できます。
ls -l *[!0-9]2010*