我有一組文件,當在我的軟體中處理時,它們會以不同的名稱出現(表示它成功完成了該過程)。
例如,輸入檔案可能會讀取 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 刪除它們。