【问题标题】:How can I make new directories using file names and move associated files into that new directory?如何使用文件名创建新目录并将关联文件移动到该新目录中?
【发布时间】:2018-12-30 04:30:00
【问题描述】:

第一次发帖,很高兴能成为这个社区的一员。

我是初学者,主要使用命令行进行下一代测序 (NGS) 分析。

我有一个包含来自音序器的数据的文件列表,如下所示:

[agh8423@quser12 all_fastq]$ ls Bio5* -al
-rw-r--r-- 1 agh8423 p30592 253029870 Jul 19 11:10 Bio5-H3K27ac-Dox-no_S5_L001_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 248177942 Jul 19 11:11 Bio5-H3K27ac-Dox-no_S5_L002_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 256860841 Jul 19 11:11 Bio5-H3K27ac-Dox-no_S5_L003_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 253399957 Jul 19 11:12 Bio5-H3K27ac-Dox-no_S5_L004_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 246636194 Jul 19 11:12 Bio5-H3K27ac-Dox-yes_S6_L001_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 242114964 Jul 19 11:13 Bio5-H3K27ac-Dox-yes_S6_L002_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 249862612 Jul 19 11:13 Bio5-H3K27ac-Dox-yes_S6_L003_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 247798281 Jul 19 11:14 Bio5-H3K27ac-Dox-yes_S6_L004_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 234917538 Jul 19 11:14 Bio5-H3K4me3-Dox-no_S3_L001_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 230571628 Jul 19 11:14 Bio5-H3K4me3-Dox-no_S3_L002_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 233025109 Jul 19 11:15 Bio5-H3K4me3-Dox-no_S3_L003_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 230268463 Jul 19 11:15 Bio5-H3K4me3-Dox-no_S3_L004_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 246254343 Jul 19 11:15 Bio5-H3K4me3-Dox-yes_S4_L001_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 241866406 Jul 19 11:16 Bio5-H3K4me3-Dox-yes_S4_L002_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 247044518 Jul 19 11:16 Bio5-H3K4me3-Dox-yes_S4_L003_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 243759599 Jul 19 11:17 Bio5-H3K4me3-Dox-yes_S4_L004_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 251009676 Jul 19 11:17 Bio5-Input-Dox-no_S1_L001_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 246054510 Jul 19 11:18 Bio5-Input-Dox-no_S1_L002_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 255798685 Jul 19 11:18 Bio5-Input-Dox-no_S1_L003_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 253896496 Jul 19 11:19 Bio5-Input-Dox-no_S1_L004_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 232179873 Jul 19 11:19 Bio5-Input-Dox-yes_S2_L001_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 227146014 Jul 19 11:19 Bio5-Input-Dox-yes_S2_L002_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 236543332 Jul 19 11:20 Bio5-Input-Dox-yes_S2_L003_R1_001.fastq.gz
-rw-r--r-- 1 agh8423 p30592 234698786 Jul 19 11:20 Bio5-Input-Dox-yes_S2_L004_R1_001.fastq.gz

如果您注意到,除了文件名的“L001/2/3/4”部分不同外,有些文件名几乎相同。这些本质上是复制样本,对于下游流程,我想连接这些文件(但这些信息可能与我的问题无关)

我想要的:创建一个父目录,其目录名称为“_S(*)_L00(1/2/3/4)_Ri_001.fastq.gz”左侧的所有内容(例如,第一个文件将有一个名为“Bio5-H3K27ac-Dox-no”的目录)。除了制作这个目录之外,我还想将所有具有上述文件前缀的文件(即所有 L001/2/3/4 的前缀名称为 Bio5-H3K27ac-Dox-no)放入该新目录中。从那里开始的计划是运行 zcat 并将文件连接成一个更容易分析的文件。

以下是我的尝试:

for file in ./*_L001_R1_001.fastq.gz.txt; do
    dir=${file%_L001_R1_001.fastq.gz.txt}
    mkdir -p "./$dir" &&
    mv -iv "$file" "./$dir"
    mv -iv "$dir"_L00* "./$dir"
done

如果我是我的目录,我会得到以下信息。

[agh8423@quser11 test]$ ls -al
total 36
drwxrwsr-x 8 agh8423 p30592  4096 Jul 22 18:27 .
drwxrwsr-x 3 agh8423 p30592 32768 Jul 22 17:27 ..
drwxrwsr-x 2 agh8423 p30592  4096 Jul 22 18:27 Bio1-Input-Dox-no_S12
drwxrwsr-x 2 agh8423 p30592  4096 Jul 22 18:27 Bio1-Input-Dox-yes_S11
drwxrwsr-x 2 agh8423 p30592  4096 Jul 22 18:27 Bio1-MYC-Dox-no_S2
drwxrwsr-x 2 agh8423 p30592  4096 Jul 22 18:27 Bio1-MYC-Dox-yes_S3
drwxrwsr-x 2 agh8423 p30592  4096 Jul 22 18:27 Bio1-WDR5-Dox-no_S5
drwxrwsr-x 2 agh8423 p30592  4096 Jul 22 18:27 Bio1-WDR5-Dox-yes_S10
-rwxrwxr-x 1 agh8423 p30592   178 Jul 22 18:29 test1.sh

我不想要的部分是目录名称末尾的 _S12 等,但我希望它保留在已移动到新目录的文件名中。

-奥斯汀

【问题讨论】:

  • 好吧,这听起来很有趣,让我们知道你是怎么做的!但说真的,SO 用户会在您完成工作后帮助您,并且在您自己研究后无法找到答案的问题上陷入困境。对于这样的脚本,您需要mkdirmv,您可以使用find,不要解析ls 输出,...
  • 不要连接文件,这不是一个好主意。独立对齐它们并将正确的读取组放入每个文件中。对生成的 bam 进行排序和合并。分析那些包含单个样本所有数据的 bam。
  • Nic3500- 感谢您对未来帖子的建议。如果您不介意,我希望您对我在下面发布的答案提供反馈。感谢您推动我自己解决问题。
  • Poshi-我拥有的当前管道将对齐所有四个 (L001/2/3/4) 文件并将结果输出到单个 bam 文件中。这些 L001/2/3/4 文件是从一个样本中获得的,但更多的是来自一个生物样本的技术复制。你有理由认为你的方法会提供不同的东西吗?谢谢!
  • 一方面,保留不同的数据(因为数据不同,它们在不同的通道中运行)更有意义,可以通过将它们保存在单独的文件中或通过单独识别每个读取来轻松识别在具有正确读取组的 ba​​m 文件中。

标签: regex bash directory filenames bioinformatics


【解决方案1】:

获取您的提案并完善它:

for file in ./*_L001_R1_001.fastq.gz.txt; do
    # $file will contain a relative folder and filename:
    # ./Bio5-H3K27ac-Dox-no_S5_L001_R1_001.fastq.gz
    # We are going to extract the filename and alter it to keep
    # the interesting part
    dir=$(basename "$file" | cut -f1 -d_)

    # Now, create the folder in the current workind directory
    mkdir -p "$dir"

    # Finally, move all the files that start with that
    # prefix to the new folder
    mv -iv "${dir}"* "$dir"
done

最后一个移动命令会抛出错误,因为它会尝试将$dir 移动到$dir,这是不可能的。但是其他文件将被移动并且工作将完成。如果您想要更干净的执行,则必须选择要移动的文件(并排除您不想移动的文件夹):

find . -maxdepth 1 -type f -name "${dir}*" | xargs -n 1 -I{} mv {} "$dir"

【讨论】:

  • 您可以使用mv -iv "$dir"?* "$dir" 来避免有关将目录移动到自身上的警告。通配符?* 要求匹配中至少有一个字符。
  • Err... @tripleee,你为什么要在变量中添加引号? AFAIK,不需要它们。
  • 应始终引用包含文件名的变量。不带引号的脚本似乎可以工作,但当您传入包含不规则空格、shell 元字符等的文件名时,会严重中断。这是一个非常常见的错误,也是许多错误的根源。见*.com/questions/10067266/…
  • 您无法预测谁想要将此代码复制/粘贴到不同的场景。尝试shellcheck.net 来诊断这个问题和许多其他问题,并在 Stack Overflow 上关注 shell 脚本标签几天,看看损坏的引用错误到底有多常见。
  • 触摸!在没有针对新场景进行完善的情况下迁移到新场景可能会很糟糕。以后我会尽量处理这些细节:-)
最近更新 更多