如何在列表中找到匹配名称的文件并将它们复制到目录中?

How to find files that match names in a list and copy them to a directory?

我有一个包含 50 个名称的列表,如下所示:

    O8-E7
    O8-F2
    O8-F6
    O8-F8
    O8-H2
    O9-A5
    O9-B8
    O9-D8
    O9-E2
    O9-F5
    O9-H12
    S37-A5
    S37-B11
    S37-B12
    S37-C12
    S37-D12
    S37-E8
    S37-G2

我想在特定目录中查看其名称包含这些元素之一的所有子目录。 例如,目录 Sample_S37-G2-from-Specimen-001 将是一个匹配项。

在这些子目录中,有一个名为 accepted_hits.bam 的文件(不幸的是,所有子目录的命名方式都相同)。我想找到这些文件并将它们复制到一个文件夹中,并使用它们来自的示例子目录的名称。

例如,我会将 accepted_hits.bam 文件从子目录 Sample_S37-G2-from-Specimen-001 复制到 new_dir 作为 S37-G2_accepted_hits.bam

我试过使用 find,但它不起作用,我也不太明白为什么。

cat sample.list | while read FILENAME; do find /path/to/sampleDirectories -name "$FILENAME" -exec cp '{}' new
_dir\; done

有什么想法吗?谢谢!

尝试交替使用 egrep

  1. 构建一个单行模式的文本文件:(pat1|pat2|pat3)

  2. 调用查找以列出所有常规文件

  3. 使用 egrep select 基于模式文件中的模式的那些

    awk 'BEGIN { printf("(") } FNR==1 {printf("%s", [=11=])} FNR>1 {printf("|%s", [=11=])} END{printf(")\n") } ' sample.list > t.sed

    find /path/to/sampleDirectories -type f | egrep -f t.sed > filelist

您正在寻找与您输入的行完全相同的目录。 第一个改进是使用通配符

cat sample.list | while read FILENAME; do
   find /path/to/sampleDirectories -name "*${FILENAME}*" -exec cp '{}' new_dir\; done

您的新问题是现在您要查找的是目录,而不是文件。您想要查找文件名为 accepted_hits.bam 的目录。 所以你的下一次尝试是解析

的输出
   find /path/to/sampleDirectories -name accepted_hits.bam | grep "${FILENAME}"

但您不想为 sample.list 中的每个条目调用查找。
您需要从 1 个查找命令开始并从中获取相关的子目录。
一个复杂的问题是您希望在 destfile 名称中包含来自 orgfile 的子字符串。查看 grep 选项 o 和 f,它们有帮助!

find /path/to/sampleDirectories -name accepted_hits.bam | while read orgfile | do
   matched_part=$(echo "${orgfile}" | grep -of sample.list)
   if [ -n "${matched_part}" ]; then
      cp ${orgfile} newdir/${matched_part}accepted_hits.bam
   fi
done

这仅在您的 sample.list 没有额外空格时有效。当你有空格而无法修改文件时,你需要copy/parse sample.list 到另一个文件。
当 sample.list 中的 50 个条目之一是 "accepted_hits.bam" 的子字符串时,您需要做一些额外的工作。

编辑:if [ -n "${matched_part}" ] 缺少 $