我有一组文件,当在我的软件中处理时,它们会以不同的名称出现(表示它成功完成了该过程)。
例如,输入文件可能读取 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 删除它们。