我需要使用目录名称的一部分重命名所有日志。
日志如下所示:
friday13/stack123/FooBar-QA-123/000001.gz
friday13/stack123/FooBar-QA-123/000002.gz
friday13/stack123/FooBar-QA-123/000003.gz
friday13/stack123/FooBar-Stage-456/000001.gz
friday13/stack123/FooBar-Stage-456/000002.gz
friday13/stack123/FooBar-Stage-456/000003.gz
friday13/stack123/FooBar-Prod-789/000001.gz
friday13/stack123/FooBar-Prod-789/000002.gz
friday13/stack123/FooBar-Prod-789/000003.gz
对于上述目录中的每个文件,我需要将它们重命名为:
FooBar-QA-123-000001.gz
FooBar-QA-123-000002.gz
FooBar-QA-123-000003.gz
FooBar-Stage-456-000001.gz
FooBar-Stage-456-000002.gz
FooBar-Stage-456-000003.gz
FooBar-Prod-789-000001.gz
FooBar-Prod-789-000002.gz
FooBar-Prod-789-000003.gz
非常感谢提前提供帮助!
答案1
使用参数扩展子串删除,以便mv
为返回的每个文件名创建命令的目标参数find
:
find . -type f -name '*.gz' -exec sh -c 'mv -- "$1" "${1%/*}-${1##*/}"' sh {} \;
或者同样使用dirname
and basename
:
find . -type f -name '*.gz' -exec sh -c '
mv -- "$1" "$(dirname "$1")-$(basename "$1")"
' sh {} \;
注意:始终首先替换mv
为echo
来测试任何类似的命令。
答案2
显然,thanasisp 的答案是基于您的帖子和您提供的示例输出,但不会更改/
为-
.为了获得您在附加评论(在您的帖子下方)中似乎期望的完整处理,可以采取以下措施来保留文件的基名从第 6 个字符开始......
如果感兴趣的文件的检测有利于:
$ find friday13 -type f -name "*.gz"
(你需要确认find
上面的基本cmd对你来说表现良好),然后完整的cmd变成:
$ find friday13 -type f -name '*.gz' -exec bash -c '
var=$(sed "s/\//-/g;s/^\.-//" < <(echo $1));
echo mv -- "$1" "${var%-*}-$(cut -c6- < <(echo ${var##*-}))"
' execbash {} \;
echo
一旦您确信打印的命令符合您的要求,只需删除上面代码片段中的 即可mv
。