重命名多个目录,同时保留中间部分具有不同的后缀

问题描述 投票:0回答:2

我正在尝试使用 bash 更改多个目录的名称,名称结构如下:

DRMAD_CA-12__MRBK01_237a8430 DRMAD_CA-17__MRBK10_766c3396
DRMAD_CA-103__MRBK100_c27a6c1c

目标是保留 MRBK 以及紧随其后的数字 (

MRBK###
),但去掉其余的。前缀的模式始终相同 (
DRMAD_CA-###__
),而后缀是“
_
”,后跟 8 个字母和数字的组合。尝试过
sed
,但似乎无法找出正确的模式。

看到 Stackoverflow 上的其他帖子,我已经厌倦了

ls | while read file; do new=$( echo $file | sed 's/[^0-9]*\([^ ]*\)[^.]*\(\..*\)*MRBK\1\2/' ) mv "$file" "$new" done

但是由于我不太了解 sed 的语法,因此它不会产生可用的结果。

bash sed rename
2个回答
1
投票

使用

rename
实用程序。
首先,打印旧名称和新名称,但不要重命名任何内容:

rename --dry-run 's/.*(MRBK\d+).*/$1/' *MRBK*

如果OK,实际重命名:

rename 's/.*(MRBK\d+).*/$1/' *MRBK*

命令行实用程序

rename
有多种风格。他们中的大多数人应该为这项任务而努力。我使用了 Aristotle Pagaltzis 的
rename
版本 1.601。要安装
rename
,只需下载其 Perl 脚本并放入
$PATH
即可。或者使用
rename
 安装 
conda
,如下所示:

conda install rename

1
投票

使用查找:

find . -type d -regextype posix-extended -regex "^.*MRBK[[:digit:]]+.*$" | while read line
do 
     dir=$(dirname $line)
     newfil=$(grep -Eo 'MRBK[[:digit:]]+' <<< $line)
     mv "$line" "$dir/$newfil"
done
© www.soinside.com 2019 - 2024. All rights reserved.