使用Bash重命名不同目录中文件名的一部分

17 浏览
0 Comments

使用Bash重命名不同目录中文件名的一部分

这是一个简单的问题,并且已经被问答多次,但是当文件在不同的目录中时就不一样了。我想做到这一点:重命名文件名的一部分,但是文件在不同的子目录中。

这是我尝试的东西:

for f in */*run?.t; do mv -i -- "$f" "${f//subset/subset5}"; done

但它也试图重命名目录(因为子集也在目录名称中)然后出现错误,因为找不到该目录名称。我漏掉了什么吗?

这是一般的目录结构:

Gene1_subset/
       Gene1file_subset.run1.t
       Gene1file_subset.run2.t
Gene2_subset/
       Gene2file_subset.run1.t
       Gene2file_subset.run2.t

以下是我想要的:

Gene1_subset/
           Gene1file_subset5.run1.t
           Gene1file_subset5.run2.t
Gene2_subset/
           Gene2file_subset5.run1.t
           Gene2file_subset5.run2.t

但它也试图重命名目录,所以您会得到以下错误:

cannot move Gene1_subset/Gene1file_subset.run1 to Gene1_subset5/Gene1file_subset5.run1 : No such file or directory

admin 更改状态以发布 2023年5月21日
0
0 Comments

您可以检查文件是否为目录,如果不是,就重命名它。

例如,[ -d FILE ]将返回true,如果FILE存在且是一个目录。

不要尝试从根目录移动所有文件,而是循环所有目录,对于每个目录循环所有文件。

例如。

#!/bin/bash
rename() {
  for dir in *; do
    if [ -d "${dir}" ]; then
      cd "${dir}"
      for f in *run?; do
        ! [ -d "${f}" ] && mv -i -- "${f}" "${f//subset/subset5}"
      done
      cd ..
    fi
  done
}
rename || exit $?
exit 0

0
0 Comments

应该要这样做:

#!/usr/bin/env bash
shopt -s extglob globstar nullglob
for f in **/*_subset.run+([0-9]).t; do
    tmp=${f##*_}
    mv -i -- "$f" "${f%_*}_${tmp/et/et5}"
done


如果你的文件结构严格遵循原样,你只需将代码改为:

mv -i -- "$f" "${f/file_subset/file_subset5}"

0