为什么它不起作用

为什么它不起作用

我有超过 100 个文件,名称如下

x.assembled.forward.fastq.gz
x(n).unassembled.reverse.fastq.gz

问题是我正在使用的管道不接受文件名中的“点”,我必须将它们全部更改为_这样

x_assembled_forward.fastq.gz
x(n)_unassembled_reverse.fastq.gz

我认为使用简单的命令是可能的:

mv *.assembled.*.fast.gz  *_assembled_*.fastq.gz

.... 显然不是! :D

我怎样才能做到这一点?

答案1

如果你已经perl-rename安装了(rename在Debian、Ubuntu和其他Debian衍生系统上调用),你可以这样做:

rename -n 's/\./_/g; s/_fastq_gz/.fastq.gz/' *fastq.gz

首先将全部替换._,然后将最后一个替换_fastq_gz.fastq.gz

-n导致它只打印它要做的更改,而不实际重命名文件。一旦您确定这符合您的要求,请删除-n以实际重命名它们:

rename  's/\./_/g; s/_fastq_gz/.fastq.gz/' *fastq.gz

答案2

mv要么获取单个文件并移动或重命名它,要么获取多个文件或目录并将它们移动到一个目录。您无法使用mv.

反而:

for name in *.*.fasta.gz; do
    newname=${name%.fasta.gz}         # remove filename suffix
    newname=${newname//./_}.fasta.gz  # replace dots with underscores and add suffix

    mv -i -- "$name" "$newname"
done

这将迭代当前目录中的所有压缩 fasta 文件,除了文件名后缀之外,名称中的其他位置至少包含一个点。它将删除已知的文件名后缀(不应将点替换为下划线),然后将剩余位中的所有点替换为下划线,并重新附加后缀。

最终的替换将在bashshell 中起作用,但如果在/bin/sh.

mv -i然后用于重命名文件(如果新名称已存在,将要求确认)。双破折号 ( --) 只是在任何名称以破折号开头的情况下使用(这些名称可能会被视为选项集,mv并且双破折号可以防止这种情况发生)。

答案3

为什么它不起作用

*在命令运行之前,由 shell 展开。它匹配现有文件。mv没有模式匹配能力。

解决方案

mmv

该命令的工作方式与您尝试执行的方式最相似。它不像 那样强大rename,但更简单。

例如mmv '*.assembled.*.fastq.gz' '#1_assembled_#2fastq.gz'

相关内容