「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
ただし、実際にはunzip
MS-DOS コマンドのポートに近いです。 MS-DOS コマンドunzip
自体は引数を glob として扱います。つまり、名前付きファイル(Microsoftオペレーティングシステムのファイル名ではなくUnixの完全に有効なファイル名)はunzip 'abc*.zip'
解凍されませんが、パターンと一致するファイルなので、実際に欲しいものは次のとおりです。abc*.zip
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
(移植可能な構文を使用する以外に、globの一部のみを大文字と小文字を区別するようにする方法はありません。)
そして
yash
:set +o case-glob ls -ld abc*.zip
上記と同じ
bash
コメントです。
-I PATTERN
¹ // --ignore=PATTERN
GNU--hide=PATTERN
によって実装された非標準拡張を考慮したくない場合ls
。
² ただし、埋め込まれた複数のシェルでパターンがファイルとbash
一致しない場合は、そのままコマンドに渡され、文字通り名前付き[aA][bB][cC]*.[zZ][iI][pP]
ファイルが抽出されます。 Bashでこのオプションを設定すると、failglob
この問題を回避できます。