我有多个这样的文件:
round3-bcF_01_bcR_01.R1.fastq
round3-bcF_01_bcR_01.R2.fastq
round4-bcF_01_bcR_01.R1.fastq
round4-bcF_01_bcR_01.R2.fastq
round3-bcF_01_bcR_02.R1.fastq
round3-bcF_01_bcR_02.R2.fastq
round4-bcF_01_bcR_02.R1.fastq
round4-bcF_01_bcR_02.R2.fastq
一直到这种形式:
round3-bcF_12_bcR_08.R1.fastq
round3-bcF_12_bcR_08.R2.fastq
另外,我有不同的文件夹,例如这些:
bcF_01_bcR_01
bcF_01_bcR_02
bcF_01_bcR_03
等等...直到
bcF_12_bcR_08
我正在使用此行移动文件:
mv *-bcF_01_bcR_01* bcF_01_bcR_01
因此,每个文件夹中应该保留 4 个文件,但这花费了我很长时间,因为我必须运行 96 次代码(我有更多的副本,所以我有超过 96 个文件夹)。
我只想将名称中包含“bcF_01_bcR_01”这一部分的文件移动到同名文件夹中。我是 bash 新手,所以任何帮助我都非常感谢。谢谢
答案1
在这种特殊情况下,可能最简单的方法就是使用内置for
循环,如下所示:
for i in {01..08}; do echo mv *-bcF_01_bcR_${i}* bcF_01_bcR_${i}/; done
- 删除
echo
命令以执行实际的文件系统更改。
答案2
使用重命名来移动文件:
$ rename -n 's/.*(bcF_[0-9]+_bcR_[0-9]+).*/$1\/$&/' *.fastq
当您准备好移动文件时,删除 -n。
答案3
mmv
(来自同名包)对于如下情况很有用:
$ mmv -n '*-bcF_01_bcR_*.*' 'bcF_01_bcR_#2/'
round3-bcF_01_bcR_01.R1.fastq -> bcF_01_bcR_01/round3-bcF_01_bcR_01.R1.fastq
round3-bcF_01_bcR_01.R2.fastq -> bcF_01_bcR_01/round3-bcF_01_bcR_01.R2.fastq
round3-bcF_01_bcR_02.R1.fastq -> bcF_01_bcR_02/round3-bcF_01_bcR_02.R1.fastq
round3-bcF_01_bcR_02.R2.fastq -> bcF_01_bcR_02/round3-bcF_01_bcR_02.R2.fastq
round4-bcF_01_bcR_01.R1.fastq -> bcF_01_bcR_01/round4-bcF_01_bcR_01.R1.fastq
round4-bcF_01_bcR_01.R2.fastq -> bcF_01_bcR_01/round4-bcF_01_bcR_01.R2.fastq
round4-bcF_01_bcR_02.R1.fastq -> bcF_01_bcR_02/round4-bcF_01_bcR_02.R1.fastq
round4-bcF_01_bcR_02.R2.fastq -> bcF_01_bcR_02/round4-bcF_01_bcR_02.R2.fastq
这里#2
指的是表达式中的第二个通配符匹配*-bcF_01_bcR_*.*
- 您可以轻松地将其扩展为一次执行多次替换,例如
mmv -n '*-bcF_*_bcR_*.*' 'bcF_#2_bcR_#3/'
删除-n
才能真正做出动作。如果您使用zsh
,它有一个可加载的等效项zmv
。