renomeia vários arquivos com delimitadores

4

Como eu poderia renomear vários arquivos como

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

Para

T11014.bam 
T11114.bam
    
por Vonton 14.11.2014 / 10:54

7 respostas

6

Existem várias maneiras de renomear a partir da linha de comando. Aqui está um forro. Vá para o diretório em que os arquivos .bam estão localizados e tente isso,

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

Como funciona:

  • Usando um loop for e o shell glob capturando os arquivos desejados,
    for i in *.bam
    do
        mv source destination
    done
  • Em seguida, extraia a parte que você deseja manter, ou seja, o segundo campo da string separado por . usando awk as,
    $ echo IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam | awk -F"." '{print $2}'
    $ T11014

Pode-se usar um separador de campo personalizado usando a opção -F . Veja man awk para mais.

    
por souravc 14.11.2014 / 11:23
8
rename 's/.*?\.([^.]+).*/$1.bam/' *.bam -vn

Remova o -vn quando puder ver o que você deseja. Aqui está meu equipamento de teste:

$ 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
    
por Oli 14.11.2014 / 12:03
4

Você pode usar o maravilhoso programa krename :

sudo apt-get install krename

Neste programa você tem uma pré-visualização de resultados, e pode, em particular, usar apenas uma certa faixa de máscara de nome de arquivo:

A máscara está em ➀. Veja os nomes dos arquivos originais em ➁ e os futuros nomes em ➂. Se parecer bem, você pode pressionar finish: ➃ - somente após isso, os arquivos serão realmente renomeados.

    
por Adobe 14.11.2014 / 11:34
3

Use o comando find para encontrar todos os arquivos *.bam e por enquanto o loop lê cada arquivo um por um e finalmente com o comando mv renomeie-os para os nomes desejados.

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

Resultado:

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

Se você marcou o resultado, remova o comando echo para renomear de verdade.

    
por devWeek 14.11.2014 / 12:27
2

Supondo que

  • o nome desejado - "corpo" é sempre depois do primeiro ponto
  • a extensão .bam está sempre presente
  • o diretório é "plano" e não possui subdiretórios

Esta solução python deve fazer o trabalho. O número de seções pode variar, ainda funcionaria:

#!/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)

Copie-o em um arquivo vazio, torne-o executável (para executá-lo sem o prefixo python3 ) e execute-o pelo comando:

</path/to/script> <directory_with_files>

Para que:

monkey.banana.peanut.bam

torna-se

banana.bam

e

monkey.apple.peaunt.another_string.and_alot_more.bam

torna-se

apple.bam

enquanto

something.bam

é deixado sozinho.

    
por Jacob Vlijm 14.11.2014 / 12:11
1

Outra solução python através do módulo 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'', item)
        shutil.move(directory+"/"+item, directory+"/"+newname)

Como correr?

python3 script.py /path/to/the/directory/where/the/files/you/want/to/rename/are/stored
    
por Avinash Raj 15.11.2014 / 07:29
0

Embora todas essas respostas sejam boas, quero mostrar um método que não envolve programação (e pode ser muito mais rápido quando você já tiver o Sublime Text instalado)

  • Instale o texto sublime ( link ) Instale o
  • Controle de pacote sublime ( link )
  • Instale o Package FileBrowser ( ctrl+shif+p > Instalar pacote > FileBrowser link )
  • Configure o atalho de teclado do FileBrowser ( ctrl+shift+p > Key Bindings User), por exemplo,

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

  • inicie o FileBrowser ( F1 )

  • multiselecione seus arquivos (selecione padrão comum > ctrl+d )
  • entrar no modo de renomeação ( shift+R )
  • editar como editor de texto comum (por exemplo, ctrl+right para alternar entre palavras)
  • aplicar renomear com Enter
por select 03.09.2015 / 10:55