【问题标题】:unix: Can I delete files in a directory that do not contain text?unix:我可以删除目录中不包含文本的文件吗?
【发布时间】:2016-02-22 17:04:19
【问题描述】:

我可以删除目录中不包含任何文本的文件吗?这些是扩展名为“.fasta”的文本文件。最初我正在运行这个脚本:

for g in `cat genenames.txt` ; do cat *${g}_*.fa > $g.fasta ; done

在如下文件列表中:

  • id_genename_othername.fa

但在某些目录中,并非列表 (genenames.txt) 中的所有基因名称都有名称匹配的文件。所以有时我会收到这样的信息:

cat: *genename_*.fa: No such file or directory 

上面的代码仍然用不存在的基因名创建了一个“.fasta”文件,我想删除它。谢谢。

【问题讨论】:

  • 当您说“无文本”时,文件为空,即。文件大小为 0 字节?
  • 是的,文件是0字节。

标签: unix


【解决方案1】:

假设你的脚本使用#!/bin/bash,我会这样做

shopt -s nullglob
while IFS= read -r pattern; do
    files=( *"$pattern"*.fa )
    if [[ "${#files[@]}" -eq 0 ]]; then
        echo "no files match pattern *$pattern*.fa"
    else
        cat "${files[@]}" > $pattern.fasta
    fi
done < genenames.txt

【讨论】:

  • 这非常接近,但并不总是有效,具体取决于文件夹中的内容。例如,我的genenames.txt 文件列出了两个基因:gene1 和gene2。这些在每个基因后带有换行符的文本文件中。如果文件夹包含 id_gene1_othername.fa 的文件,那么我会得到正确的输出:一个名为 gene1.fasta 的文件,其中的数据来自原始文件。但是在一个有文件id_gene2_othername.fa,但没有文件名有gene1的文件夹中,输出的是gene1.fasta和gene2.fasta两个文件,都是gene2的拼接数据。
  • 在那种情况下,文件名中是否有both“gene1”和“gene2”的文件?也许我们只需要带有 2 个下划线的 files=(*_"$pattern"_*.fa)
  • 所有文件都是gene1或gene2。到目前为止,我正在工作的文件夹中的文件要么全是基因 1,要么全是基因 2,但我会遇到文件夹中同时包含两个基因的文件夹。但是为了确保我清楚,即使两个基因都存在于文件夹中,每个文件也只是一个或另一个。
  • 是的! files=(*_"$pattern"_*.fa) 已修复。谢谢。
【解决方案2】:

您是否尝试过以下方法?

for g in `cat genenames.txt` ; do cat *${g}_*.fa 2>/dev/null > $g.fasta ; done

这应该可以防止未找到的错误生成文件

【讨论】:

  • 这消除了错误,但仍然制作了空文件。
猜你喜欢
  • 2011-03-21
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2016-05-22
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多