2016-03-16 4 views
1

У меня есть несколько файлов в папке, где я хочу сократить имена. Вот входные файлыПереименование нескольких файлов в папке в unix

Входной

S_12_O_319_K27ac_S12818.sorted.bam 
S_12_O_319_K27me3_S12815.sorted.bam 
S_12_O_319_K4me1_S12816.sorted.bam 
S_12_O_319_K4me3_S12817.sorted.bam 
S_14_AS_11_K27ac_S12843.sorted.bam 
S_14_AS_11_K27me3_S12840.sorted.bam 
S_14_AS_11_K4me1_S12841.sorted.bam 
S_14_AS_11_K4me3_S12842.sorted.bam 
S_12_O_319_K27ac_S12818.sorted.bam.bai 
S_12_O_319_K27me3_S12815.sorted.bam.bai 
S_12_O_319_K4me1_S12816.sorted.bam.bai 
S_12_O_319_K4me3_S12817.sorted.bam.bai 
S_14_AS_11_K27ac_S12843.sorted.bam.bai 
S_14_AS_11_K27me3_S12840.sorted.bam.bai 
S_14_AS_11_K4me1_S12841.sorted.bam.bai 
S_14_AS_11_K4me3_S12842.sorted.bam.bai 

Выход

S_12_O_319_K27ac.bam 
S_12_O_319_K27me3.bam 
S_12_O_319_K4me1.bam 
S_12_O_319_K4me3.bam 
S_14_AS_11_K27ac.bam 
S_14_AS_11_K27me3.bam 
S_14_AS_11_K4me1.bam 
S_14_AS_11_K4me3.bam 
S_12_O_319_K27ac.bam.bai 
S_12_O_319_K27me3.bam.bai 
S_12_O_319_K4me1.bam.bai 
S_12_O_319_K4me3.bam.bai 
S_14_AS_11_K27ac.bam.bai 
S_14_AS_11_K27me3.bam.bai 
S_14_AS_11_K4me1.bam.bai 
S_14_AS_11_K4me3.bam.bai 

Обратите внимание, что мои файлы имеют два различных расширений, один * .bam другой является * .bam.bai. Я хочу переименовать всех из них сразу, чтобы сократить имя. Удалите часть _S12843.sorted из всех них. Обратите внимание, что это 5-й знак подчеркивания, а число, следующее за _S12843, отличается для разных файлов. Только аналогичный шаблон представляет собой строку sorted. Поэтому хотелось бы усечь всю эту часть, чтобы сократить имя. Как я могу достичь этого с помощью bash или rename или sed. Любая помощь будет оценена по достоинству. Я могу удалить строку с отсортированными, но не цифрами.

+0

Возможного дубликата [пакетное переименование с Bash] (http://stackoverflow.com/questions/602706/batch-renaming-with-bash) – n00dl3

ответ

3

Использование rename утилиты вы можете сделать:

rename 's/_[^_.]+\.sorted//' *.sorted.* 

Если вы не имеете rename затем использовать этот for цикл:

for f in *.sorted.*; do 
    mv "$f" "${f/_S[[:digit:]]*.sorted}" 
done 
+1

Оба из них работает , предпочитают один в цикле, поскольку он потребляет меньше времени. Я не написал эту вещь [: digit:] '. Не могли бы вы объяснить это мне однажды. –

+1

'[[: digit:]]' является свойством POSIX, чтобы соответствовать цифре '[0-9]' в шаблонах glob или regex – anubhava

+0

ah ok, единственная проблема заключалась в том, чтобы идентифицировать '_S' в идеале это тоже должно работать' для f in * .sorted. *; do mv "$ f" "$ {f/_S [[0-9]] *. sorted}"; done' –

0

Это может работать для вас (GNU SED):

sed -r 's/^(.*)_[^_.]*\.[^.]*(.*)/mv "&" "\1\2"/e' file 

или:

sed -r 's/^(.*)_[^_.]*\.[^.]*(.*)/mv "&" "\1\2"/' file | shell 

где shell может быть bash и т.д.

Смежные вопросы