〜b_1.0.tgz
の名前を変更したいのですが、がバージョン番号に変更される可能性があります。どのように達成できますか?Linuxでregexキャプチャグループを使用してファイルの名前を変更するにはどうすればよいですか?
たとえば、バージョン番号を保持する必要がない場合は、mv a*.tgz b.tgz
を使用できます。
〜b_1.0.tgz
の名前を変更したいのですが、がバージョン番号に変更される可能性があります。どのように達成できますか?Linuxでregexキャプチャグループを使用してファイルの名前を変更するにはどうすればよいですか?
たとえば、バージョン番号を保持する必要がない場合は、mv a*.tgz b.tgz
を使用できます。
のzshはまさにそれを意図しているユーティリティzmv
、付属しています。 zmv
は正規表現をサポートしていませんが、ファイル名生成パターン(別名グロビング)のキャプチャグループを提供しています。
まず、zmv
を有効にする必要があります。これはあなたの~/.zshrc
に以下を追加することによって行うことができます。
autoload -Uz zmv
あなたは、このようにそれを使用することができます:
zmv 'a_(*)' 'b_$1'
これはa_
はb_
で置き換えられるようにa_*
に一致するすべてのファイルを、名前を変更します。あなたはあまり一般的になりたい場合は、当然のことながら、パターンを調整することができます。
のみ.tgz
ファイル名前を変更する:.tar.gz
.tgz
ファイルの名前を変更する zmv 'a_(*.tgz)' 'b_$1'
を
zmv 'a_(*).tgz' 'b_$1.tar.gz'
のみの名前を変更するa_1.0.tgz
:
zmv 'a_(1.0.tgz)' 'b_$1'
保存側上にあるように、あなたはオプション-n
最初にzmv
を実行することができます。これは印刷されるだけで、何が起こるかは実際には何も変えません。詳細はman zshcontrib
をご覧ください。
私はzsh
にあまり馴染んでいないので、正規表現をサポートしているかどうかわかりませんが、本当にここで必要とは思われません。
あなたはグロブを使用してファイルにマッチして置換使用することができます。グロブパターンでは
for file in a_[0-9].[0-9].tgz; do
echo "$file" "${file/a/b}"
done
を、[0-9]
は0
と9
間の任意の数と一致します。 ${file/a/b}
は、a
の最初のオカレンスをb
に置き換えます。
結果に満足すればecho
をmv
に変更してください。あなたはこれがあなたはそれが何をしたいのかないことが確実なときecho
を削除
for f in a*.tgz; do
echo mv "$f" "b${f:1}"
done
:あなたは手紙b
でa*.tgz
に一致するすべてのファイルの最初の文字を置換したいと仮定すると、
。
${f:1}
は、${name:offset}
パラメータ拡張を使用します。 (OS X上の)マニュアルzshexpn
から:
オフセットが負でない場合、変数名は内容が文字列の最初の文字、[から文字に を開始オフセット スカラー代わるものではその後、場合.. 。]
バージョン番号は、2つの数字に限定されない「1.1.1」のようなものです。 'a'の後にすべてのものをグループとして取り込み、' b'の後にこのグループを追加することは可能ですか? – JasmineOT
あなたはグロブ内の任意のもの(例えば 'a _ *。tgz')と一致させることができ、' $ {file/a/b} "と同じ置換を使用して文字' a'を 'b'に変更することができます。 –