開始パターンと終了パターンを持つファイルのリスト

開始パターンと終了パターンを持つファイルのリスト

「abc」で始まり、「.zip」で終わるディレクトリ内のすべてのファイルを一覧表示したいと思います。

を使用しようとしていますls

このディレクトリには、abc<date>で始まる多くのzipファイルがありますxvz<date>。私は次のリストを取得したいと思いますabc<date>.zip

答え1

lsファイル名にはパターンマッチングは行われません。単に引数として与えられたディレクトリとファイルの内容をリストします。

一方、シェルには次のようなシェルがあります。ワイルドカードまたはファイル名の生成またはパス名拡張パターンに一致するファイルのリストにパターンを展開します。

ここで、globパターンはabc*.zip*ワイルドカード文字で以下を表します)。任意数の文字)。

printf印刷など、必要なコマンドにそれを渡すことができます。

printf '%s\n' abc*.zip

ls -lこれを渡して、次のファイルのプロパティを表示することもできます。

ls -ld abc*.zip

-d(これらのファイルのいずれかがそのタイプの場合は、このファイルが必要です。目次lsそうでなければ、その内容がリストされます)。

または、一度に複数のファイルのみを抽出できる場合は、そのunzipファイルを抽出してください。unzip残念ながらそうではないので、以下を使用またはxargs -n1繰り返すfor必要があります。

printf '%s\0' abc*.zip | xargs -r0n1 unzip

または:

for file in abc*.zip; do unzip "$file"; done

ただし、実際にはunzipMS-DOS コマンドのポートに近いです。 MS-DOS コマンドunzip自体は引数を glob として扱います。つまり、名前付きファイル(Microsoftオペレーティングシステムのファイル名ではなくUnixの完全に有効なファイル名)はunzip 'abc*.zip'解凍されませんが、パターンと一致するファイルなので、実際に欲しいものは次のとおりです。abc*.zipabc*.zip

 unzip 'abc*.zip'

(実際に上記のxargsアプローチは間違っています。たとえば、for呼び出されたファイルがある場合はパターンとして処理されるためです!アーカイブを抽出するよりユニークな方法については、参照してください。)abc*.zipunzipbsdtarzip


大文字と小文字を区別しない一致に²ポータブルを使用できます[aA][bB][cC]*.[zZ][iI][pP]。一部のシェルには、大文字と小文字を区別しない一致のために拡張されたワイルドカードがあります。

  • zsh:

    setopt extendedglob
    ls -ld (#i)abc*.zip
    

    または:

    ls -ld ((#i)abc)*.zip
    

    abcその部分が大文字と小文字を区別しないようにしたい場合。

  • ksh93:

    ls -ld ~(i)abc*.zip
    

    または:

    ls -ld ~(i:abc)*.zip
    
  • そしてbash

    shopt -s nocaseglob
    ls -ld abc*.zip
    

    (移植可能な構文を使用する以外に、globの一部のみを大文字と小文字を区別するようにする方法はありません。)

  • そしてyash

    set +o case-glob
    ls -ld abc*.zip
    

    上記と同じbashコメントです。


-I PATTERN¹ // --ignore=PATTERNGNU--hide=PATTERNによって実装された非標準拡張を考慮したくない場合ls

² ただし、埋め込まれた複数のシェルでパターンがファイルとbash一致しない場合は、そのままコマンドに渡され、文字通り名前付き[aA][bB][cC]*.[zZ][iI][pP]ファイルが抽出されます。 Bashでこのオプションを設定すると、failglobこの問題を回避できます。

答え2

ls abc*.zip

ただし、ファイルが多すぎると失敗します(シェル拡張には拡張できる引数の数に制限があります)。

find . -name "abc*.zip"

これはおそらく最も一般的です。引用符が必要です。一部の実装では、大文字と小文字を区別しない検索(これも一致)を代わりにfind使用することがあります。-iname-nameaBc<date>.ZIP

ls | grep -x "abc.*\.zip"

.*フィルタ grep は正規表現を使用するため、シェルで拡張に使用\.するワイルドカード表記とは異なります。grep -i大文字と小文字を区別しない検索に使用されます。

答え3

lsの出力をにパイプできますgrep

abcファイル名に以下を含むすべてのファイルを探したいとしましょう。

ls -f | grep abc

特定のパターン変形が必要な場合、man grep

答え4

ls例では、検索するディレクトリを指定する必要があります。

ls -la ~/file*.* 
ls -la ./file*.*

それは私のために働いたが、明らかにパターンで検索をサポートしていません

関連情報