
私は私のためにいくつかのファイル操作を実行するスクリプトを書いた。*
特定の種類のすべてのファイルに関数を適用するためにワイルドカード演算子を使用していますが、理解できない点があります。unzip
これらのフォルダにすべてのファイルを入れることができます。
unzip "*".zip
ただし、後ですべてのzipファイルを削除するには、次の手順を実行する必要があります。
rm *.zip
つまり、引用符は必要ありません。一方、*(「ファイルの不一致」警告を表示)だけを与えると、解凍は機能しません。
なぜ違うの?私にとってこれはまったく同じ仕事のようです。それともワイルドカードを間違って使用しているのでしょうか?
ワイルドカードについてUnixではこれを深く掘り下げないでください。rm
私の文書ではzip
何も見つかりません。
私はMac(Yosemite)で端末を使用しています。
答え1
状況をとてもよく説明してくれましたね。パズルの最後の部分は、unzip
基本的にワイルドカードを処理できることです。
http://www.info-zip.org/mans/unzip.html
議論
ファイル[.zip]
...
ワイルドカード式は、一般的なUnixシェル(sh、ksh、csh)でサポートされている式に似ており、次のものを含めることができます。
* 0個以上の文字シーケンスと一致します。
*ワイルドカードを引用すると、シェルがワイルドカードを拡張するのを防ぎ、シェルがワイルドunzip
カードを確認し、独自のロジックに従って拡張を処理できるようにします。
rm
一方、ワイルドカードはサポートされていません。それ自体したがって、ワイルドカードを引用すると、rm
ファイル名で文字通りアスタリスクを検索するように指示されます。
unzip *.zip
これがうまくいかない理由は、unzip
構文が複数のzipファイルをまったく受け入れないためです。複数の引数がある場合、2番目以降の引数はアーカイブのファイルになると予想されます。
解凍 [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] ファイル [.zip] [ファイル...] [-xx ファイル...] [-d exdir]
答え2
これら2つのコマンドの違いは引用符*
文字です。シェルでコマンドを呼び出してこの*
文字を引数として使用すると、シェル自体が引数を評価します。この例を見てください。
$ ls
file1.zip file2.zip file3.zip file4.txt
以下があります*
:
$ ls *.zip
file1.zip file2.zip file3.zip
シェルはワイルドカードを評価し、次のようにコマンドを作成します。
$ ls file1.zip file2.zip file3.zip
引用されたワイルドカードを使用すると、文字通り次の名前のファイルとして解釈されます*.zip
。
$ ls "*".zip
ls: cannot access *.zip: No such file or directory
unzip
複数の圧縮ファイルを引数として使用してユーティリティを呼び出すことはできません。しかし、開発者はこのために別のアプローチを選択しました。マンページから:
ファイル[.zip]
[...]ワイルドカード式は、一般的なUnixシェル(sh、ksh、csh)でサポートされている式と似ています。 [...](オペレーティングシステムによって解釈または変更される可能性のある文字は必ず引用してください。特にUnixとVMSではさらにそうです。 )
答え3
違いは、最初のケースではシェル自体がグローブを拡張することです。
% cd /
% echo *
Applications Library Network System Users Volumes bin cores ...
%
2番目のケースでは、アプリケーション自体はその文字を使用してSomething™を実行します。
% cd /
% perl -E 'chdir "/tmp" or die; say for glob($ARGV[0])' "*"
com.apple.launchd.aj4FEhYqm5
...
引用符がない場合、シェルはまずグローブを拡張し、シェルグローブが拡張されるターゲットを使用してコマンドを実行します。
答え4
zipが複数の引数を処理する方法のため、引用符が必要です。
rm
:パラメータリストのすべてのファイルを削除します。
zip
:最初のパラメータでファイルを解凍します。残りのパラメーターのファイルのみを抽出します。
$ ls *.zip
file1.zip file2.zip file3.zip
$ unzip *.zip
Archive: file1.zip
caution: filename not matched: file2.zip
caution: filename not matched: file3.zip
ご覧のとおり、file1.zip で file2.zip と file3.zip を見つけようとします。
複数のzipファイルを一度に抽出できるように、zipは独自にglobを解釈し、さまざまな結果を生成することをサポートしています。