4 votos

renombrar varios archivos con delimitadores

¿Cómo puedo cambiar el nombre de varios archivos 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
 

A,

 T11014.bam 
T11114.bam
 

8voto

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

Quite el -vn cuando pueda ver que hace lo que quiere. Aquí está mi arnés de prueba:

 $ 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
 

6voto

Carra Puntos 6832

Usted puede utilizar maravillosa krename programa de:

sudo apt-get install krename

En este programa podrás tener una vista previa del resultado, y, en particular, el uso de ciertas gama de nombre de archivo de la máscara:

enter image description here

La máscara es en➀. Ver los nombres de archivo originales en ➁ y nombres en➂. Si le parece bien, puede pulsar finalizar: ➃ - sólo después de esto los archivos realmente será cambiado de nombre.

4voto

souravc Puntos 9854

Hay varias maneras de cambiar el nombre de la línea de comandos. Aquí es un forro. Vaya al directorio donde el .bam se encuentran los archivos y probar este,

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

Cómo funciona:

  • Mediante un bucle for y shell globo reventado los archivos que desee,
 for i in *.bam
¿
 mv origen destino
hecho
  • Siguiente extracto de la parte que desea conservar, es decir, el segundo campo de la cuerda separados por . uso de awk como
 $ echo IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam | awk-F"." '{print $2}'
 $ T11014

Uno puede utilizar personalizado separador de campo utilizando -F opción. Ver man awk más.

3voto

KasiyA Puntos 10471

Utilice el comando find para encontrar todos los archivos *.bam y by while lea cada uno de los archivos uno por uno y finalmente con el comando mv renombre los nombres deseados.

 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
 

Si marcó el resultado, quite el comando echo al nombre real.

2voto

Jacob Vlijm Puntos 24137

Suponiendo que

  • el nombre deseado- "cuerpo" es siempre después de que el primer punto
  • el .bam de extensión está siempre presente
  • el directorio es "plana" y no tiene sub directorios

Esta solución python debe hacer el trabajo. El número de secciones puede variar, todavía funciona:

#!/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 en un archivo vacío, hacerlo ejecutable (para que se ejecute sin la python3 prefijo) y ejecutar el comando:

</path/to/script> <directory_with_files>

Así que:

monkey.banana.peanut.bam

se convierte en

banana.bam

y

monkey.apple.peaunt.another_string.and_alot_more.bam

se convierte en

apple.bam

mientras

something.bam

se queda solo.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: