【发布时间】:2017-05-08 16:27:58
【问题描述】:
我有 80 对以下类型的文件:
170309-N701-S517_S1_L001_R1_001.fastq.gz
170309-N701-S517_S1_L001_R2_001.fastq.gz
170309-N701-S502_S2_L001_R1_001.fastq.gz
170309-N701-S502_S2_L001_R2_001.fastq.gz
170309-N701-S503_S3_L001_R1_001.fastq.gz
170309-N701-S503_S3_L001_R2_001.fastq.gz
..
170309-N710-S507_S79_L001_R1_001.fastq.gz
170309-N710-S507_S79_L001_R2_001.fastq.gz
170309-N710-S508_S80_L001_R1_001.fastq.gz
170309-N710-S508_S80_L001_R2_001.fastq.gz
基本上,一对由以下文件组成:
170309-N701-S517_S<ID>_L001_R1_001.fastq.gz
170309-N701-S517_S<ID>_L001_R2_001.fastq.gz
其中 ID 从 1 到 80 不等。
我想创建 80 个名为 S1..S80 的子文件夹,并将每一对放在相应的文件夹中,例如
170309-N701-S517_S1_L001_R1_001.fastq.gz
170309-N701-S517_S1_L001_R2_001.fastq.gz
转到子文件夹 S1
170309-N701-S502_S2_L001_R1_001.fastq.gz
170309-N701-S502_S2_L001_R2_001.fastq.gz
转到子文件夹 S2
等等。
我写了以下脚本:
#!/bin/bash
for i in {1..80}
do
mkdir S$i
mv "*_S"$i"_*" S$i
done
但它没有按预期工作。它创建了子文件夹 S1..S80。但是,它没有移动任何文件。而是产生了
mv: cannot stat `*_S1_*': No such file or directory
mv: cannot stat `*_S2_*': No such file or directory
等等。
我做错了什么?能改一下剧本吗?
【问题讨论】:
-
Globs 不在引号中展开,请去掉引号。
-
您的下划线导致搜索出现问题,因为它们不会在引号内并且需要转义。该行应该
mv *\_$i\_* -
去掉引号后,你需要像
${i}那样用{}包围变量,否则它会寻找一个名为$i_的变量。 -
@JNevill 下划线不需要转义,问题是,正如 ccarton 提到的,它试图扩展
$i_。使用{}正确扩展变量是正确的解决方案。 -
@CharlesDuffy:我认为这个问题不应该被当作一个骗子来解决。当然,这里的答案类似于链接中的答案,但问题不是,因此standard SO guidelines 不是骗子。据我所知,这个问题最大的罪过是标题太不具体了。
标签: bash loops escaping wildcard