用于从父文件夹名称重命名多个文件的Shell脚本

Sim*_*mon 2 linux bash shell scripting rename

我有这样的文件结构:

  • 00000010
    • 000000001.file1
    • 000000001.file2
  • 00000020
    • 00000003.file1
    • 00000003.file2
    • 00000003.file3
  • ...

因此,有8位数字的文件夹包含一个或多个文件,名称以8位数字开头.但是这些文件名 - 比方说 - 不同步.所以现在我尝试在bash中递归地重命名它们来存档:

  • 00000010
    • 000000010.file1
    • 000000010.file2
  • 00000020
    • 00000020.file1
    • 00000020.file2
    • 00000020.file3
  • ...

我的脚本看起来像:

#! /bin/bash

find * -maxdepth 1 -name "*" -type d | while read -r dir
do
        rename 's/$dir\/[0-9]{8}/$dir/' *
done
Run Code Online (Sandbox Code Playgroud)

但这不起作用,并给出错误

全局符号"$ dir"需要在(eval 1)第1行显式包名.

我怎么能写它来根据文件夹名重命名文件?

谢谢你的帮助!

cod*_*ict 5

使用"代替'rename

你应该运行rename里面的文件$dir,所以参数rename必须是$dir/*而不仅仅是*

既然你要替换dir/8digits使用dir/dir正则表达式的更换部分应$dir\/$dir

通过上述更改,命令如下所示:

rename "s/$dir\/[0-9]{8}/$dir\/$dir/" $dir/*
Run Code Online (Sandbox Code Playgroud)