35554842200284685106000166550020003504201637715423.xml
という名前のファイルがあり、名前を42200284685106000166550020003504201637715423.xml
に変更するだけです(最後の48文字より前のすべてを削除します)。この単純な正規表現(.{48}$
)は、最後の48文字を抽出できますが、Bashでrename
を使用して機能させることはできません。
rename
とこの正規表現を使用して、最後の48文字のみに名前を変更するにはどうすればよいですか?
編集:
rename --help
の出力
[root@ip-000-00-0-000 tmp]# rename --help
Usage:
rename [options] <expression> <replacement> <file>...
Rename files.
Options:
-v, --verbose explain what is being done
-s, --symlink act on the target of symlinks
-n, --no-act do not make any changes
-h, --help display this help and exit
-V, --version output version information and exit
For more details see rename(1).
ありがとうございました。
ここでは実際にrename
は必要ありません。回避することができます。
$ file=35554842200284685106000166550020003504201637715423.xml
$ newname=$(sed -E 's/.*(.{48})/\1/'<<<"$file");
$ mv -v "$file" "$newname"
renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'
これは、bash固有のP.E.を使用したものです。パラメータ拡張。
file=35554842200284685106000166550020003504201637715423.xml
外部ツールのmvのみ
mv -v "$file" "${file:6}"
出力
renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'
最後の48文字を保持することになります。
mv -v "$file" "${file:(-48)}"
あなたのrename
はutil-linux
からの役に立たないもののようです。
正規表現を使用する場合は、代わりにPerlベースのバリアントの1つ(prename
と呼ばれることもあります)がインストールされていることを確認してください。その後:
rename -n 's:^\./\d+(?=\d{44}\.xml\Z)::' ./*.xml
(ここでは、48文字を、より具体的にするために、44桁の後に.xml
を付けて置き換えます)。
または、zsh
のzmv
を使用することもできます。
autoload zmv
zmv -n '[0-9]##([0-9](#c44).xml)' '$1'
または
zmv -n '<->.xml~^?(#c48)' '$f[-48,-1]'
(実際に行うには、-n
(ドライラン)を削除してください)。
これは、競合から保護するという利点もあります(同じ宛先名を持つ2つのファイル)。
bash
を使用すると、次のようなことができます。
shopt -s extglob nullglob
for f in +([[:digit:]]).xml; do
((${#f) <= 48)) || echo mv -i -- "$f" "${f: -48}"
done
file=35554842200284685106000166550020003504201637715423.xml
rename "s/"$file"/"${file: -48}"/" *.xml
rename --version
:
/usr/bin/rename using File::Rename version 1.10