正規表現を使用して名前を変更したファイルのハンドルを取得するには?

正規表現を使用して名前を変更したファイルのハンドルを取得するには?

正規表現を使用してファイル名を変更しています。

f='/path/to/file'
rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' "$f"

それでは、名前を変更する必要があるかどうかわからない場合は、作業できるように名前が変更されたファイルへのハンドルをどのように取得できますか?

答え1

renamePerl式(より正確には置換)を提供しています。式を割り当てる代わりに、renamePerl を使用して式を評価し、ファイルを移動します。

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"

ターゲットがまだ存在しないか、ソースが存在するかなどを確認するなどのエラーチェックを追加できます。

関連情報