Linux 重命名与目录同名的文件-bash脚本

Linux 重命名与目录同名的文件-bash脚本,linux,bash,Linux,Bash,我想重命名文件,使其与文件夹同名 我有一个主文件夹,大约有1000个文件夹。每个文件夹中都有另一个文件。在最后一个文件夹中,我有不同扩展名的文件。我想重命名具有pdb扩展名的文件 以下是我的文件夹结构: pv----| |--m10\ pk\ result0.pdb result1.pdb result2.pdb |--m20\ pk\ result0.pdb result1.pdb result2.pdb |--m30\ pk\ result0.pd

我想重命名文件,使其与文件夹同名

我有一个主文件夹,大约有1000个文件夹。每个文件夹中都有另一个文件。在最后一个文件夹中,我有不同扩展名的文件。我想重命名具有pdb扩展名的文件

以下是我的文件夹结构:

pv----|

       |--m10\ pk\ result0.pdb result1.pdb result2.pdb
       |--m20\ pk\ result0.pdb result1.pdb result2.pdb
       |--m30\ pk\ result0.pdb result1.pdb result2.pdb
我想要这样的东西:

pv----|

       |--m10\ pk\ m10_result0.pdb m10_result1.pdb m10_result2.pdb
       |--m20\ pk\ m20_result0.pdb m20_result1.pdb m20_result2.pdb
       |--m30\ pk\ m30_result0.pdb m30_result1.pdb m30_result2.pdb
这是我写的代码,但不起作用

for d in MD_PR2 / * / * / 

do

     (cd "$d" && for file in *.pdb ; do mv "$file" "${file/result/$d_result}" ; done)
done
我的代码是删除每个文件名的“结果”,我不知道。它变成了0.pdb,1.pdb…等等

在此之前非常感谢您

user@pc:~$ tree
.
├── m10
│   └── pk
│       ├── result0.pdb
│       ├── result1.pdb
│       └── result2.pdb
├── m20
│   └── pk
│       ├── result0.pdb
│       ├── result1.pdb
│       └── result2.pdb
└── m30
    └── pk
        ├── result0.pdb
        ├── result1.pdb
        └── result2.pdb
您的代码不工作,因为
$d\u result
被解释为变量名,而不是
$d
\u result
的串联。我建议使用
${d}\u result

然而,我会建议另一种方法,一种不需要将
cd
放入每个目录的方法

代码:

之后:

user@pc:~$ tree
.
├── m10
│   └── pk
│       ├── m10_pk_result0.pdb
│       ├── m10_pk_result1.pdb
│       └── m10_pk_result2.pdb
├── m20
│   └── pk
│       ├── m20_pk_result0.pdb
│       ├── m20_pk_result1.pdb
│       └── m20_pk_result2.pdb
└── m30
    └── pk
        ├── m30_pk_result0.pdb
        ├── m30_pk_result1.pdb
        └── m30_pk_result2.pdb
代码说明:

  • shopt-s globstar
    :允许将
    **
    扩展为“递归的所有文件和目录”
  • 变量“file”包含包括目录在内的文件名
  • 选中
    “$file”=~”.pdb“
    中的“file”以忽略使用目录
  • 使用
    sed
    生成新文件名:
    • 搜索和替换:
      s/Search/replace/
    • 查找类似dir1/dir2/smthg.pdb的内容:
      (.*)/(.*)/(.*.pdb)
    • 替换为dir1/dir2/dir1\u dir2\u smthg.pdb:
      \1/\2/\1\u2\u3
      (如果还想将重命名的文件移动到父目录中,则替换为
      \1\u2\u3
    • (为了便于阅读,我删除了一些反斜杠)
  • mv文件到newfilename
之前:

user@pc:~$ tree
.
├── m10
│   └── pk
│       ├── result0.pdb
│       ├── result1.pdb
│       └── result2.pdb
├── m20
│   └── pk
│       ├── result0.pdb
│       ├── result1.pdb
│       └── result2.pdb
└── m30
    └── pk
        ├── result0.pdb
        ├── result1.pdb
        └── result2.pdb
您的代码不工作,因为
$d\u result
被解释为变量名,而不是
$d
\u result
的串联。我建议使用
${d}\u result

然而,我会建议另一种方法,一种不需要将
cd
放入每个目录的方法

代码:

之后:

user@pc:~$ tree
.
├── m10
│   └── pk
│       ├── m10_pk_result0.pdb
│       ├── m10_pk_result1.pdb
│       └── m10_pk_result2.pdb
├── m20
│   └── pk
│       ├── m20_pk_result0.pdb
│       ├── m20_pk_result1.pdb
│       └── m20_pk_result2.pdb
└── m30
    └── pk
        ├── m30_pk_result0.pdb
        ├── m30_pk_result1.pdb
        └── m30_pk_result2.pdb
代码说明:

  • shopt-s globstar
    :允许将
    **
    扩展为“递归的所有文件和目录”
  • 变量“file”包含包括目录在内的文件名
  • 选中
    “$file”=~”.pdb“
    中的“file”以忽略使用目录
  • 使用
    sed
    生成新文件名:
    • 搜索和替换:
      s/Search/replace/
    • 查找类似dir1/dir2/smthg.pdb的内容:
      (.*)/(.*)/(.*.pdb)
    • 替换为dir1/dir2/dir1\u dir2\u smthg.pdb:
      \1/\2/\1\u2\u3
      (如果还想将重命名的文件移动到父目录中,则替换为
      \1\u2\u3
    • (为了便于阅读,我删除了一些反斜杠)
  • mv文件到newfilename

我不清楚结构。你的文件夹结构是什么?最好的方法是发布如何使用
mkdir
touch
重新创建文件夹结构。如
mkdir-p-pb/m10/pk-pb/m11;触摸文件夹.pdb中的pb/m10/pk/file_
。请使用按钮
{}
(在问题编辑器的标题中)正确格式化代码。选择你的代码块,点击按钮,把每一行都变成“代码”。我不清楚它的结构。你的文件夹结构是什么?最好的方法是发布如何使用
mkdir
touch
重新创建文件夹结构。如
mkdir-p-pb/m10/pk-pb/m11;触摸文件夹.pdb中的pb/m10/pk/file_
。请使用按钮
{}
(在问题编辑器的标题中)正确格式化代码。选择您的代码块并单击按钮,使每一行成为“代码”。