如何重命名文件夹中的文件,同时保持部分名称不变?

如何重命名文件夹中的文件,同时保持部分名称不变?

我有多个文件(约 1000 个),其名称如下:

db_1582779454_1582778086_69_2BB5873B-84B0-424B-9A1A-F648EE7CD5FA
db_1582037529_1579666328_6_03C074E4-6BB9-434A-B95D-4FE29787060C
db_1582037529_1579666328_6_03C074E4-9AA0-434A-B95D-4FE29787060C

想要通过更改最终值来递归地重命名这些文件夹

2BB5873B-84B0-424B-9A1A-F648EE7CD5FA
03C074E4-6BB9-434A-B95D-4FE29787060C
03C074E4-9AA0-434A-B95D-4FE29787060C

达到新价值

2AE5873D-84C0-424B-9A1A-F648EE7CD5FA
Final folder names = db_1582779454_1582778086_69_2AE5873D-84C0-424B-9A1A-F648EE7CD5FA

我试过

find -iname . -exec rename -n 's/(db\_\d+\_\d+\_\d+\_)03C074E4-6BB9-434A-B95D-4FE29787060C/$12AE5873D-84C0-424B-9A1A-F648EE7CD5FA/' {} \;

谢谢

答案1

创建一个名为 file.list 的文件,其中包含文件名。

运行这个 for 循环:

对于 $(cat file.list) 中的 FL,
执行
NEWFL=$(echo $FL | cut -f5 -d'_')
echo "旧:$FL,新:$NEWFL"
完成

输出结果如下:

旧:db_1582779454_1582778086_69_2BB5873B-84B0-424B-9A1A-F648EE7CD5FA,新:2BB5873B-84B0-424B-9A1A-F648EE7CD5FA 旧
:db_1582037529_1579666328_6_03C074E4-6BB9-434A-B95D-4FE29787060C,新:03C074E4-6BB9-434A-B95D-4FE29787060C
旧: db_1582037529_1579666328_6_03C074E4-9AA0-434A-B95D-4FE29787060C,新:03C074E4-9AA0-434A-B95D-4FE29787060C

您可以用 mv 命令替换“echo 命令”

新信息:

您可以像这样分隔每个名称的前缀和后缀:

对于 $(cat file.list) 中的 FL,
执行
PREFIX=$(echo $FL | cut -f1-4 -d'_')
SUFFIX=$(echo $FL | cut -f5 -d'_')
echo "文件名:$FL,前缀:$PREFIX,后缀:$SUFFIX"
完成

从那里,您可以使用以下方式重命名:

mv $FL $PREFIX_$NEWSUFFIX

希望有帮助

答案2

#!/bin/sh
export replaceby='_2AE5873D-84C0-424B-9A1A-F648EE7CD5FA'
find . -type f -name "db_*_*_*_*-*-*-*-*" -exec sh -c '
    for file in "$@"; do
        #You may want to make a backup statement here
        mv "$file" "${file%_*}${replaceby}"
    done
' find-shell {} +

replaceby变量只是为了清楚起见,您可以直接在mv语句中使用它的值。

请注意,您提供的第 2 个和第 3 个文件将成为相同的最终文件,因为它们的名称直到最后一个下划线都相同。这意味着第三个文件将覆盖第二个文件。您可以(应该?)在 之前添加备份语句mv,例如cp "$file" "${file}.bak",以防出现任何此类问题。


关于${file%_*}构造:https://stackoverflow.com/a/34952009

相关内容