正規表現を使用してファイル名を変更しています。
f='/path/to/file'
rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' "$f"
それでは、名前を変更する必要があるかどうかわからない場合は、作業できるように名前が変更されたファイルへのハンドルをどのように取得できますか?
答え1
rename
Perl式(より正確には置換)を提供しています。式を割り当てる代わりに、rename
Perl を使用して式を評価し、ファイルを移動します。
f='/path/to/file'
newname=$( perl -pe 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' <<<"$f" )
printf 'New name is "%s"\n' "$newname"
mv -- "$f" "$newname"
あるいは、式を使用して新しい名前を出力し、次からキャプチャすることもできますrename
。
f='/path/to/file'
newname=$( rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s; print "$_\n"' "$f" )
printf 'New name is "%s"\n' "$newname"
rename
これはPerlベースのモジュールを使用していると仮定しますFile::Rename
。
答え2
ジョブを部分的に送信する必要があります。名前を変更するファイルを見つけて、変換されたファイル名を生成して適用する必要があります。この時点でターゲットファイル名がわかるので、さらに処理できます。
f='/path/to/file'
g=$(printf '%s\n' "$f" | sed -E 's/^(.*)([ab])(.*)([cd])(.*)$/\1\4\3\2\5/')
mv -- "$f" "$g"
echo "Target is $g"
ターゲットがまだ存在しないか、ソースが存在するかなどを確認するなどのエラーチェックを追加できます。