我在不同的文件夹中有多个 .pdb 文件。如何循环遍历整个目录,将所有文件命名为一个特定名称 test.pdb?
样本结构
file1
file1.pdb
xyz.txt
file2
file2.pdb
xyz.txt
file3
file3.pdb
xyz.txt
所需的输出结构
file1
test.pdb
xyz.txt
file2
test.pdb
xyz.txt
file3
test.pdb
xyz.txt
我现在使用的代码:
for d in */ ; do
mv *.pdb test.pdb
done
但它不起作用。
答案1
假设您的每个目录中有一个 .pdb 文件(否则这个问题没有意义):
for dir in */ ; do
[ -f "$dir/*.pdb" ] && mv "$dir/*.pdb" "$dir/test.pdb"
done
答案2
您的尝试失败有两个直接原因:
d
您没有使用用于迭代目录的变量。- 您的迭代 glob 不包括最终文件,仅包括子目录。
编辑:首先,这里是一个改进的更简单的答案,不需要执行任何检查,因为初始 glob 仅选择 pdb 文件。
for one-path in root-directory/*/*.pdb
do
mv "$one-path" "$(dirname $one-path)/test.pdb"
done
我最初的较差答案以及一些评论如下,使用 bash shell 和两个核心实用程序(basename
和dirname
):
for one-path in root-directory/*/*
do
[[ "$(basename "$one-path")" =~ pdb$ ]] \
&& mv "$one-path" "$(dirname $one-path)/test.pdb"
done
root-directory
是您正在使用的绝对路径规范。root-directory/*/*
是一个 glob,它将返回您定义的情况下的实际文件,而不仅仅是子目录。=~
是一个 bash shell 扩展,允许有限的正则表达式测试,在本例中为以结尾的字符串pdb
&&
是逻辑与;它是简单if
...的常见习语替代then
(不要忘记前一行的反斜杠延续符号)。