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

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

というファイルがあり、35554842200284685106000166550020003504201637715423.xml名前を次のように変更するだけです42200284685106000166550020003504201637715423.xml(最後の48文字の前のすべての項目を削除)。この単純な正規表現()は最後の48文字を抽出できますが、Bashでは動作させることは.{48}$できません。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).

ありがとうございます。

答え1

実際にはこれは必要ありませんrename。問題を解決できます。

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

答え2

これはbashのみですポリビニルアルコールパラメータ拡張。

file=35554842200284685106000166550020003504201637715423.xml

外部ツール専用mv

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

出力

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

最後の48文字を保持してください。

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

答え3

あなたのものはrename役に立たないと思いますutil-linux

prename正規表現を使用するには、Perlベースのバリアント(正規表現とも呼ばれます)をインストールする必要があります。それから:

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

答え4

file=35554842200284685106000166550020003504201637715423.xml
rename  "s/"$file"/"${file: -48}"/" *.xml

rename --version:

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

関連情報