У меня есть набор файлов, которые при обработке в моей программе выводятся с другим именем (что означает, что процесс успешно завершен).
Например, входной файл может иметь вид 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 '' + \;
который, как оказалось, находится вutil-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
если это не так, или вы можете создать быструю функцию оболочки, чтобы сделать это,
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
Выполните следующую команду в каталоге, где, как вы подозреваете, находятся нежелательные файлы:
Найти . -iname "Выровненный.СортироватьпоКоординатам.bam" | xargs rm -f
Я бы рекомендовал сначала запустить команду find, чтобы проверить, какие нужные файлы поступают в качестве вывода, а затем удалить их с помощью xargs rm -f.