web-dev-qa-db-ja.com

正規表現を使用してBashでファイルの名前を変更する

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).

ありがとうございました。

8
devegili

ここでは実際にrenameは必要ありません。回避することができます。

$ file=35554842200284685106000166550020003504201637715423.xml
$ newname=$(sed -E 's/.*(.{48})/\1/'<<<"$file"); 
$ mv -v "$file" "$newname"
renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'
18
terdon

これは、bash固有のP.E.を使用したものです。パラメータ拡張。

file=35554842200284685106000166550020003504201637715423.xml

外部ツールのmvのみ

mv -v "$file" "${file:6}"

出力

renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'

最後の48文字を保持することになります。

mv -v "$file" "${file:(-48)}"
15
Jetchisel

あなたのrenameutil-linuxからの役に立たないもののようです。

正規表現を使用する場合は、代わりにPerlベースのバリアントの1つ(prenameと呼ばれることもあります)がインストールされていることを確認してください。その後:

rename -n 's:^\./\d+(?=\d{44}\.xml\Z)::' ./*.xml

(ここでは、48文字を、より具体的にするために、44桁の後に.xmlを付けて置き換えます)。

または、zshzmvを使用することもできます。

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
9
file=35554842200284685106000166550020003504201637715423.xml
rename  "s/"$file"/"${file: -48}"/" *.xml

rename --version

/usr/bin/rename using File::Rename version 1.10
2
GAD3R