从文件名中删除某些单词

从文件名中删除某些单词

我有一组文件,当在我的软件中处理时,它们会以不同的名称出现(表示它成功完成了该过程)。

例如,输入文件可能读取 SAM111_tsta.fastq,然后输出为 SAM111_tstaAligned.SortbyCoord.bam。

我想知道,是否有一种方法(通过命令行)递归地筛选目录并找到所有具有“Aligned.SortbyCoord.bam”并且仅删除“Aligned.SortbyCoord”的文件,以便我最终得到“SAM111_tsta” .bam?

答案1

如果您发现类似。您应该能够执行以下操作:

find dir -name '*_tstaAligned.SortbyCoord.bam' -exec bash -c 'mv "$0" "${0/_tstaAligned.SortbyCoord.bam/_tsta.bam}"' "{}" \;

尽管使用了 bash ${var//find_all/substitute_with_this},但您只会匹配以 结尾的文件,_tstaAligned.SortbyCoord.bam因为这是给find.但是_tstaAligned.SortbyCoord.bam,如果任何文件有多个,您将替换名称中出现的所有。 (我猜不太可能。)

为了进行测试,请执行以下操作:

find dir -name '*tstaAligned.SortbyCoord.bam' -exec bash -c 'printf "mv \"%s\" \"%s\"\n" "$0" "${0/_tstaAligned.SortbyCoord.bam/_tsta.bam}"' "{}" \;

答案2

有重命名命令,

find -name '*Aligned.SortbyCoord.bam' -exec rename Aligned.SortbyCoord '' + \;

事实证明是在实用程序Linux所以你必须安装它,该软件包中有一些不错的东西。

或者你可以用以下命令修复一个简单的列表

find -name '*Aligned.SortbyCoord.bam' \
| sed -E 's/(.*)Aligned.*/mv "&" "\1.bam"/e'

如果你的 sed 足够新,或者

find -name '*Aligned.SortbyCoord.bam' \
| sed -E 's/(.*)Aligned.*/mv "&" "\1.bam"/' \
| sh -x

如果不是,或者你可以创建一个快速 shell 函数来完成它,

doit () { while read; do mv "$REPLY" "${REPLY%Aligned*}.bam"; done; }
find -name '*Aligned.SortbyCoord.bam' | doit

或作为单线

find -name '*Aligned.SortbyCoord.bam' | while read f; do mv "$f" "${f%A*}.bam"; done

答案3

在您怀疑存在不需要的文件的目录中运行以下命令:

寻找 。 -我的名字 ”对齐.SortbyCoord.bam" | xargs rm -f

我建议首先运行 find 命令来验证作为输出的所需文件,然后使用 xargs rm -f 删除它们。

相关内容