删除目录中所有文件的特定后缀

删除目录中所有文件的特定后缀

我有一个基因型文件,我已将其拆分为 2000 多个 5K SNP 文件,方法是使用

split -d geno_file

我得到的输出是这样的:

table_subset_0001
table_subset_0002
table_subset_0003
.
.
table_subset_0099
.
.
table_subset_0999

我想删除 0 并得到

table_subset_1
table_subset_2
table_subset_3
.
.
table_subset_93
.
.
table_subset_999

有什么办法可以做到这一点吗?

答案1

使用 Perlrename实用程序:

rename 's/_0+/_/' table_subset_*

这会将_后面的一个或多个零字符替换为_

上面的内容与Perl 附带的rename实用程序(有时称为)一起使用。prename某些发行版renameutil-linux完全不兼容的实用程序安装实用程序。

如果您的系统上尚未安装 Perl 的 rename,则可能会找到安装它的方法这里

答案2

为了纯洁...

一个纯粹的bash答案:(感谢@steeldriver)

shopt -s extglob
for file in table_subset_0*; do
    mv "$file" "${file/_+(0)/_}"
done

一个纯粹的 GNUsed答案:

ls | sed -n -r '
    /^(table_subset_)0+(.*)/ ! d
    s//mv & \1\2/
    e
'

一个纯粹的 GNUawk答案:

ls | awk -F '_0+' 'NF > 1 { system("mv " $0 " " $1 "_" $2) }'

答案3

为了添加到 @John1024 的解决方案,这里有一个使用标准 Bash 命令的类似解决方案:

for file in table_subset_*; do
    new_name=$(echo "$file" | sed -E -e 's/_0+/_/')
    mv "$file" "$new_name"
done

原理是一样的。我们迭代所有文件并将_0其替换为_.

答案4

您可以awk首先使用而不是使用split并执行另一个rename工具。

awk 'NR%5000==1{ file=sprintf("table_subset_%d", ((++c)) )} {print >file}' geno_file

这会将geno_file文件分割成 5K 文件块,这些文件带有数字后缀,不带前导零,但您可以随意使用0Xd上面的 4 位长度,例如sprintf("..._%04d", ((++c)) )

或者,如果您只想将geno_file输出文件分割为 9 个部分,那么首先split正确使用其选项来设置从 1 开始数字后缀(默认为 0)并-a N(生成长度为 N 的后缀(默认为 2) ),您可以简单地使用如下:

split -a 1 --numeric-suffixes=1 -l TOTALLINES/9HERE table_subset_

但仍然不要忘记awk解决方案。

相关内容