「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
この問題を回避できます。
答え2
ls abc*.zip
ただし、ファイルが多すぎると失敗します(シェル拡張には拡張できる引数の数に制限があります)。
find . -name "abc*.zip"
これはおそらく最も一般的です。引用符が必要です。一部の実装では、大文字と小文字を区別しない検索(これも一致)を代わりにfind
使用することがあります。-iname
-name
aBc<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*.*
それは私のために働いたが、明らかにパターンで検索をサポートしていません