Переименовать несколько файлов с разделителями

Как я могу переименовать несколько файлов, как,

IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam
IonXpress_050.T11114.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam

Чтобы,

T11014.bam 
T11114.bam

7 ответов

Решение

Есть несколько способов переименования из командной строки. Вот один лайнер. Перейдите в каталог, где .bam файлы находятся и попробуйте это,

for i in *.bam; do mv "$i" "$(echo $i | awk -F"." '{print $2}').bam"; done

Как это устроено:

  • Использование цикла for и оболочки, перехватывающей нужные файлы,
    ибо я в *.bam
    делать
        мв источник назначения
    сделанный
  • Затем извлеките часть, которую вы хотите сохранить, т.е. второе поле строки, разделенное . с помощью awk как,
    $ echo IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam | awk -F "." '{print $ 2}'
    $ T11014

Можно использовать пользовательский разделитель полей, используя -F вариант. Увидеть man awk для большего.

rename 's/.*?\.([^.]+).*/$1.bam/' *.bam -vn

Удалить -vn когда вы можете видеть, что он делает то, что вы хотите. Вот мой тестовый комплект:

$ touch 34234234kh.TESTING00{1..3}.234978623478y234.bam
$ rename 's/.*?\.([^.]+).*/$1.bam/' *.bam -vn
34234234kh.TESTING001.234978623478y234.bam renamed as TESTING001.bam
34234234kh.TESTING002.234978623478y234.bam renamed as TESTING002.bam
34234234kh.TESTING003.234978623478y234.bam renamed as TESTING003.bam

Вы можете использовать замечательный krename программа:

sudo apt-get install krename

В этой программе у вас есть предварительный просмотр результата, и вы можете, в частности, использовать только определенный диапазон маски имени файла:

введите описание здесь

Маска на ➀. Смотрите исходные имена файлов в ➁ и будущие имена в ➂. Если все в порядке, вы можете нажать Готово: only - только после этого файлы будут фактически переименованы.

Используйте команду find, чтобы найти все *.bam файлы и в то время как цикл чтения каждого файла по одному и, наконец, с mv Команда переименуйте их в желаемые имена.

find /path/to/maindir -type f -name "*.bam" -print0 | while IFS= read -d '' -r file
do
    echo mv -v "$file" /path/to/maindir/"$(awk -F'.' '{print $2".bam"}'<<< "$file")";
done

Результат:

mv -v /home/USER/maindir/IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam /home/USER/maindir/T11014.bam
mv -v /home/USER/maindir/IonXpress_050.T11114.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam /home/USER/maindir/T11114.bam

Если вы проверили результат, удалите echo Команда на реальное переименование.

При условии, что

  • желаемое имя - "тело" всегда после первой точки
  • .bam расширение всегда присутствует
  • каталог "плоский" и не имеет подкаталогов

Это решение Python должно сделать работу. Количество разделов может варьироваться, все равно будет работать:

#!/usr/bin/env python3

import os
import shutil
import sys

directory = sys.argv[1]

for item in os.listdir(directory):
    if not item.startswith("."):
        edit = item.split("."); newname = (".").join([edit[1], edit[-1]])
        if len(edit) > 2:
            shutil.move(directory+"/"+item, directory+"/"+newname)

Скопируйте его в пустой файл, сделайте его исполняемым (чтобы запустить его без python3 префикс) и запустите его командой:

</path/to/script> <directory_with_files>

Чтобы:

monkey.banana.peanut.bam

становится

banana.bam

а также

monkey.apple.peaunt.another_string.and_alot_more.bam

становится

apple.bam

в то время как

something.bam

остался один

Еще одно решение Python через re модуль.

script.py

#!/usr/bin/python3
import sys
import re
import os
import shutil

directory = sys.argv[1]
for item in os.listdir(directory):
    if '.' in item:
        newname = re.sub(r'^[^.]+\.([^.]*).+(\.bam)', r'\1\2', item)
        shutil.move(directory+"/"+item, directory+"/"+newname)

Как запустить?

python3 script.py /path/to/the/directory/where/the/files/you/want/to/rename/are/stored

Хотя все эти ответы хороши, я хочу показать вам метод, который не включает программирование (и может быть намного быстрее, если у вас уже установлен Sublime Text)

  • Установить Sublime Text ( http://www.sublimetext.com/) Установить
  • Управление возвышенными пакетами ( https://packagecontrol.io/installation)
  • Установите пакет FileBrowser (ctrl+shif+p > Установить пакет> FileBrowser http://github.com/aziz/SublimeFileBrowser)
  • Настройте сочетание клавиш FileBrowser (ctrl+shift+p > Key Bindings User) например

    { "keys": ["f1"], "command": "dired", "args": { "immediate": true } }

  • запустить FileBrowser (F1)

  • выберите несколько файлов (выберите общий шаблон> ctrl+d)
  • перейти в режим переименования (shift+R)
  • редактировать как обычный текстовый редактор (например, ctrl+right прыгать между словами)
  • применить переименование с Enter
Другие вопросы по тегам