使用部分路径名重命名文件

使用部分路径名重命名文件

我需要使用目录名称的一部分重命名所有日志。

日志如下所示:

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 {} \;

或者同样使用dirnameand basename

find . -type f -name '*.gz' -exec sh -c '
    mv -- "$1" "$(dirname "$1")-$(basename "$1")"
' sh {} \;

注意:始终首先替换mvecho来测试任何类似的命令。

答案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

相关内容