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


9

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

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

ディレクトリには、abc<date>およびで始まる多数のzipファイルがありxvz<date>ます。のリストを取得したいだけですabc<date>.zip


ls -1 | grep "abc$(your_date).zip"
Stan Strum

回答:


15

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

一方、シェルには、パターンをそのパターンに一致するファイルのリストに展開する、グロビングまたはファイル名生成と呼ばれる機能があります。

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

printf印刷など、好きなコマンドに渡します。

printf '%s\n' abc*.zip

ls -lこれらのファイルの属性を表示するために渡すこともできます:

ls -ld abc*.zip

-dこれらのファイルのタイプが、ディレクトリlsそうでない場合はその内容を一覧表示します)。

または、一度に複数のファイルunzipしか抽出できない場合にそれらを抽出しunzipます。残念ながらそうではないので、を使用するxargs -n1forループする必要があります:

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

または:

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

しかし、実際にunzipは、MS-DOSコマンドのポートのようであり、unzipそれ自体が引数をグロブとして扱います。言い換えれば、unzip 'abc*.zip'呼び出されるファイルabc*.zip(Microsoftオペレーティングシステムではなく、Unixでは完全に有効なファイル名)を解凍しませんが、abc*.zipパターンに一致するファイルなので、実際には次のようになります。

 unzip 'abc*.zip'

(実際にはxargsfor上記のアプローチは間違っabc*.zipています。たとえば、呼び出されたファイルがある場合、unzipそれをパターンとして扱います。参照してください。bsdtarzipアーカイブを抽出するより一義的な方法は、をして)


大文字と小文字を区別しないマッチングでは、[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
    

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

  • yash

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

    bash上記と同じ発言。


9
ls abc*.zip

ただし、ファイルが多すぎる場合、これは失敗します(展開できる引数の数に関して、シェルの展開には制限があります)。

find . -name "abc*.zip"

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

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

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


1
この制限はシェルの制限ではないことに注意してください。これは、execve()システムコールのカーネル制限です。
ステファンChazelas

find、サブディレクトリでもこれらのファイルを探すことに注意してください。使用find . ! -name . -prune -name 'abc*.zip' -printまたはfind . -maxdepth 1 -name 'abc*.zip'あなたの場合はfindサポートは-maxdepthGNUまたはBSD上などfind . -depth 1 -name 'abc*.zip'、あなたの場合はfindサポート-depth <n>いくつかのBSDのような、現在のディレクトリに制限します。
ステファンChazelas

$ ls ../*.a私のために働いた(親ディレクトリにアーカイブをリストする)。
Daniel

0

を使用ls abc*.zipして、abcの開始文字列と.zipの終了文字列の基準に一致する結果に結果を絞り込みます。アスタリスクは、xvz開始文字を含めずに、それらの結果に一致するように拡張されます。


-1

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

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

それは私にとっては機能しますが、明らかにパターンによる検索をサポートしていません


1
これは問題に対処していません。ファイルはで始まり、abcで終わる必要があります.zip
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.