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

时间:2019-03-20 14:30:44

标签: linux bash

我想重命名我的文件,以便它们的名称与文件夹相同。

我有一个主文件夹,其中包含大约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 ..etc

非常感谢

1 个答案:

答案 0 :(得分:0)

之前:

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_result被解释为变量名,而不是$d_result的串联。我建议使用${d}_result

但是我建议另一种方法,不需要cd进入每个目录。

代码:

shopt -s globstar
for file in **; do 
  if [[ "$file" =~ ".pdb" ]] ; then 
    mv "$file" `echo $file | sed -e 's/\(.*\)\/\(.*\)\/\(.*.pdb\)/\1\/\2\/\1_\2_\3/'`; 
  fi; 
done;

之后:

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" =~ ".pdb"检查“文件”以忽略使用目录
  • 使用sed生成新文件名:
    • 搜索并替换:s/search/replace/
    • 找到类似dir1 / dir2 / smthg.pdb的内容:(.*)/(.*)/(.*.pdb)
    • 替换为dir1 / dir2 / dir1_dir2_smthg.pdb:\1/\2/\1_\2_\3(如果还要将重命名的文件移至父目录,则替换为\1_\2_\3
    • (出于可读性考虑,我删除了一些反斜杠)
  • 将mv文件转换为新文件名