unzipコマンドを呼び出すbashスクリプトがあります。ファイルパスに、「a」、「apple」、および「applescript」という3つの特定の単語のうちの1つであるサブディレクトリ名を含むファイルを抽出する必要があります。したがって、/a/b/c.txt ファイルと /com/apple/foo.txt ファイルの両方を抽出する必要があります。
一般的なbashコマンドラインglobの場合は、同様のものを使用できることがわかりますが、*/{a,apple,applescript}/*.txt
unzipコマンドはbashではなくglobを評価するコマンドなので、これには適用されません。
したがって、次のコマンドは機能しません。unzip -oj file.zip '*/{a,apple,applescript}/*.txt'
私が試したことの1つは、次の3つの個別のunzipコマンドを順番に実行することです。
unzip -oj file.zip '*/a/*.txt'
unzip -oj file.zip '*/apple/*.txt'
unzip -oj file.zip '*/applescript/*.txt'
a
ただし、zipファイルにサブディレクトリとサブディレクトリが明示的に含まれていないと機能しないため、そうすることはapple
保証できません。
これを達成するための最良の方法は何ですか?正規表現を使用して単一のzipコマンドでこれを実行する方法はありますか?または、zipファイルに3つのサブディレクトリ名がすべて存在しない場合、3つの連続したコマンドが機能するようにする方法はありますか?
答え1
中かっこ拡張を使用してアスタリスクを引用すると、シェルグローバル拡張から保護できます。
unzip -oj file.zip "*/"{a,apple,applescript}"/*.txt"
パターンの1つが一致しない場合は、エラーで終了します。問題がある場合は、終了ステータス11(ファイルが一致しないことを示す)を無視できます。
unzip -oj file.zip "*/"{a,apple,applescript}"/*.txt" || if [[ $? != 11 ]]; then
echo Something bad happened
fi