回答:
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
しかし、実際にunzip
は、MS-DOSコマンドのポートのようであり、unzip
それ自体が引数をグロブとして扱います。言い換えれば、unzip 'abc*.zip'
呼び出されるファイルabc*.zip
(Microsoftオペレーティングシステムではなく、Unixでは完全に有効なファイル名)を解凍しませんが、abc*.zip
パターンに一致するファイルなので、実際には次のようになります。
unzip 'abc*.zip'
(実際にはxargs
、for
上記のアプローチは間違っabc*.zip
ています。たとえば、呼び出されたファイルがある場合、unzip
それをパターンとして扱います。参照してください。bsdtar
zip
アーカイブを抽出するより一義的な方法は、をして)
大文字と小文字を区別しないマッチングでは、[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
上記と同じ発言。
ls abc*.zip
ただし、ファイルが多すぎる場合、これは失敗します(展開できる引数の数に関して、シェルの展開には制限があります)。
find . -name "abc*.zip"
これはおそらく最も一般的なものです。引用符がそこになければなりません。一部のfind
実装で-iname
は-name
、大文字と小文字を区別しない検索の代わりにを使用することもできます(aBc<date>.ZIP
一致します)。
ls | grep -x "abc.*\.zip"
気.*
及び\.
フィルタのgrepを使用するための拡張のためにシェルが使用表記ワイルドカードとは異なる正規表現です。grep -i
大文字と小文字を区別しない検索に使用します。
execve()
システムコールのカーネル制限です。
find
、サブディレクトリでもこれらのファイルを探すことに注意してください。使用find . ! -name . -prune -name 'abc*.zip' -print
またはfind . -maxdepth 1 -name 'abc*.zip'
あなたの場合はfind
サポートは-maxdepth
GNUまたはBSD上などfind . -depth 1 -name 'abc*.zip'
、あなたの場合はfind
サポート-depth <n>
いくつかのBSDのような、現在のディレクトリに制限します。
$ ls ../*.a
私のために働いた(親ディレクトリにアーカイブをリストする)。
ls -1 | grep "abc$(your_date).zip"
?