我想重命名我的文件,以便它们的名称与文件夹相同。
我有一个主文件夹,其中包含大约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
非常感谢
答案 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/
(.*)/(.*)/(.*.pdb)
\1/\2/\1_\2_\3
(如果还要将重命名的文件移至父目录,则替换为\1_\2_\3
)