我有多个文件(约 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