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

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

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
4
задан 14 November 2014 в 14:37

7 ответов

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

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

, Как он работает:

  • Используя для цикла и шарика оболочки, захватывающего желаемые файлы,
    for i in *.bam
    do
        mv source destination
    done
  • Следующее извлечение часть, что Вы хотите сохранить т.е. второе поле строки разделенными . использование 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 для больше.

6
ответ дан 17 November 2019 в 13:37
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
8
ответ дан 17 November 2019 в 13:37

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

sudo apt-get install krename

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

enter image description here

маска в вћЂ. Посмотрите исходные имена файлов в вћЃ и будущие имена в вћ. Если это кажется прекрасным, можно нажать конец: вћѓ — только после этого файлы будет на самом деле переименован.

4
ответ дан 17 November 2019 в 13:37

Используйте находят команду к нахождению всего *.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, команда к реальному переименовывает.

3
ответ дан 17 November 2019 в 13:37

Принятие этого

  • желаемое имя - "тело" всегда после первой точки
  • .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

оставлен в покое.

2
ответ дан 17 November 2019 в 13:37

Другое решение для 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
1
ответ дан 17 November 2019 в 13:37

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

  • текст Сублимата Установки ( http://www.sublimetext.com/ ) Установка
  • Сублимированное Управление Пакетом ( https://packagecontrol.io/installation)
  • Установка Пакет, FileBrowser (ctrl+shif+p> Пакет Установки> FileBrowser http://github.com/aziz/SublimeFileBrowser)
  • Настраивают сочетание клавиш FileBrowser (ctrl+shift+p> Пользователь Привязок клавиш), например,

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

  • запускаются, FileBrowser (F1)

  • мультивыбирают Ваши файлы (выберите общий шаблон> ctrl+d)
  • входят, переименовывают режим (shift+R)
  • , редактирование как общий текстовый редактор (например, ctrl+right для перехода между словами)
  • применяется, переименовывают с Enter
0
ответ дан 17 November 2019 в 13:37

Другие вопросы по тегам:

Похожие вопросы: