如何将多个文件移动到同名文件夹

如何将多个文件移动到同名文件夹

我有多个这样的文件:

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

相关内容