将文件夹中的文件重命名为一个名称

将文件夹中的文件重命名为一个名称

我在不同的文件夹中有多个 .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

您的尝试失败有两个直接原因:

  1. d您没有使用用于迭代目录的变量。
  2. 您的迭代 glob 不包括最终文件,仅包括子目录。

编辑:首先,这里是一个改进的更简单的答案,不需要执行任何检查,因为初始 glob 仅选择 pdb 文件。

for one-path in root-directory/*/*.pdb
do
  mv "$one-path" "$(dirname $one-path)/test.pdb"
done

我最初的较差答案以及一些评论如下,使用 bash shell 和两个核心实用程序(basenamedirname):

for one-path in root-directory/*/*
do
  [[ "$(basename "$one-path")" =~ pdb$ ]] \
  &&  mv "$one-path" "$(dirname $one-path)/test.pdb"
done
  1. root-directory是您正在使用的绝对路径规范。
  2. root-directory/*/*是一个 glob,它将返回您定义的情况下的实际文件,而不仅仅是子目录。
  3. =~是一个 bash shell 扩展,允许有限的正则表达式测试,在本例中为以结尾的字符串pdb
  4. &&是逻辑与;它是简单if...的常见习语替代then(不要忘记前一行的反斜杠延续符号)。

相关内容