私は以下を行うために「エレガントな」ソリューションを設計しようとしています。
unzip applications/<abc>.zip -d applications/<abc>/
unzip applications/<def>.zip -d applications/<def>/
unzip applications/<ghi>.zip -d applications/<ghi>/
unzip applications/<jkl>.zip -d applications/<jkl>/
中かっこ拡張は適用されません。これは私が探しているものと「反対」です(または何か抜けましたか?)。
ループがfor
行く道ですか?私は過去のコントロール(
何と一緒にxargs
引数を逆参照するか)を使用または活用することについて考えましたが、!:1
状況はすぐに単純化されるのではなく複雑になりました。
私は正規表現の逆参照に偏っていると思います。シェルに似たものはありますか?
答え1
いくつかの変数拡張規則を持つforループが必要に応じて機能することがあります。
for file in applications/*.zip
do
unzip "$file" -d "${file%.zip}"
done
この表現は、「${file%.zip}
最後からwithの内容を削除する」という意味です。$file
.zip
したがって、最初のループは$file
読みやすいapplications/abc.zip
ので${file%.zip}
読みますapplications/abc
。
答え2
あなたが言及したものxargs
。 xargs コマンドは、Thompson または Mashey シェルがfor
ループをサポートしていないときに PWB/Unix に現れました。for
あなたの場合は、ループが最も適していると思います。ただし、可能であればプログラムでパイプを使用することはエレガントなので、xargsを使用してこれを行う方法は次のとおりです。
printf "%s\n" abc def ghi jkl | xargs -I {} unzip applications/{}.zip -d applications/{}/
答え3
1つの可能性は変数です。前/別のコマンドに割り当てるだけです。
a=abc
unzip applications/"$a".zip -d applications/"$a"/
a=def
!unzip
答え4
はい、for
ループはあなたの仕事のための素晴らしい解決策です。
for i in abc def ghi jkl; do
unzip applications/"$i".zip -d applications/"$i"/
done
または、スクリプトの代わりにコマンドラインで使用するには、1行に同じコマンドを使用します。
for i in abc def ghi jkl; do unzip applications/"$i".zip -d applications/"$i"/; done
例の値には引用符は$i
必要ありませんが、スペースやその他の特殊文字を含む値が絶対にないと確信している場合は、引用符を使用することをお勧めします。