我有超过 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 文件,除了文件名后缀之外,名称中的其他位置至少包含一个点。它将删除已知的文件名后缀(不应将点替换为下划线),然后将剩余位中的所有点替换为下划线,并重新附加后缀。
最终的替换将在bash
shell 中起作用,但如果在/bin/sh
.
mv -i
然后用于重命名文件(如果新名称已存在,将要求确认)。双破折号 ( --
) 只是在任何名称以破折号开头的情况下使用(这些名称可能会被视为选项集,mv
并且双破折号可以防止这种情况发生)。
答案3
为什么它不起作用
*
在命令运行之前,由 shell 展开。它匹配现有文件。mv
没有模式匹配能力。
解决方案
- 使用 Larry Wall 的 perl 重命名:参见https://unix.stackexchange.com/a/533925/4778
- 使用毫米波
mmv
该命令的工作方式与您尝试执行的方式最相似。它不像 那样强大rename
,但更简单。
例如mmv '*.assembled.*.fastq.gz' '#1_assembled_#2fastq.gz'