web-dev-qa-db-ja.com

ls:ワイルドカード検索で同じパターンに一致するディレクトリを表示せず、ファイルのみを表示

次のような典型的なビジネス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年も含まれているため、lsinvoices201にもファイルを一覧表示しますが、現在のディレクトリにあるものを一覧表示します。さらにおかしなことに、tax2010 *ファイルがまったく存在せず、例のように3つのディレクトリではなく、50個あると想像してください。はい、試してみました:lsindicateでもありません。どのファイルがどのディレクトリにあるかはわかりませんが、すべてのファイルが現在のディレクトリにあるかのように、トップダウンで一覧表示します。 (-Rオプションを明示的に指定しない限り、確かに知っています)

さらに、findでもこれを実行できることを知っていますが、単純なlsワンライナーでこのタスクを実行する方法もあります(明らかに、はるかに少ない複雑な構文)?

5
syntaxerror

あなたの質問は、「lsのみでディレクトリを除外するパターンでファイルを一覧表示する方法」のようです。

純粋なlsでそれを行う方法はありません。次のようにls + grepを組み合わせることができます。

ls -ld *2010* | grep -v '^d'

ただし、そのためにはfindを使用する方がはるかに優れています。

find . -maxdepth 1 -type f -name "*2010*"
12
rush

lsのみを使用してディレクトリを選択的にフィルタリングすることはできません。 Rush's answer で説明されているように、findまたはls | grepが必要です。しかし、あなたの具体的な例として、あなたが尋ねた質問に答えるには あなたのコメント

繰り返しますが、現在のディレクトリにあるtax *ファイルを一覧表示したいのですが、同じ作業ディレクトリに存在し、指定された2010ワイルドカードにも一致するディレクトリ「invoices2010」リストではパターンをスキップする必要があります。

できるよ

ls -l --ignore='invoices*' *tax2010*

ignoreシェルパターンに一致するものはすべて除外されます。

2
ire_and_curses

Zshを使用…

ls -l *2012*(.)

glob修飾子.は通常のファイルのみを意味します。

ls -dlp *2010*はソリューションの良いスタートですが、出力をどのようにしたいかによって異なります。

0
Julian

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のバックスラッシュを修正しました。

0
Don R

Lsでgrepを使用しないでください。

Bashでは、名前に「2010」が含まれているが番号で開始されていないファイルを表示できます。

ls -l *[!0-9]2010*

0
daisy