Linux 重命名与目录同名的文件-bash脚本
我想重命名文件,使其与文件夹同名 我有一个主文件夹,大约有1000个文件夹。每个文件夹中都有另一个文件。在最后一个文件夹中,我有不同扩展名的文件。我想重命名具有pdb扩展名的文件 以下是我的文件夹结构: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
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”以忽略使用目录“$file”=~”.pdb“
- 使用
生成新文件名: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”以忽略使用目录“$file”=~”.pdb“
- 使用
生成新文件名: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_
。请使用按钮{}
(在问题编辑器的标题中)正确格式化代码。选择您的代码块并单击按钮,使每一行成为“代码”。