使用Bash重命名不同目录中文件名的一部分
使用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日
您可以检查文件是否为目录,如果不是,就重命名它。
例如,[ -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