¿Cuál es el código bash para eliminar distintos caracteres en un nombre de archivo hasta cierto punto?

¿Cuál es el código bash para eliminar distintos caracteres en un nombre de archivo hasta cierto punto?

Tengo un conjunto de archivos que varían en caracteres. Por ejemplo:

IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq

Me gustaría eliminar todos los personajes hasta el punto S514y S238, manteniendo todo lo que viene después. ¿Es posible hacer esto cuando los archivos tienen números diferentes como se muestra en mi ejemplo?

Hay alrededor de 1100 archivos, por lo que hacer esto manualmente llevaría bastante tiempo.

Lo más cerca que he podido hacer es:

rename 's/IDNR19_//g' *.fastq

para eliminar la parte IDNR19_, pero esto no resuelve mi problema.

Respuesta1

Suponiendo que estos son nombres de archivos en el disco a los que desea cambiarles el nombre, no cadenas almacenadas en una variable o en un archivo de texto. Puede utilizar un bucle de shell simple:

for name in *.fastq; do
    newname=${name#*_*_*_}
    printf 'Would move "%s" to "%s"\n' "$name" "$newname"
    # mv -i -- "$name" "$newname"
done

Esto recorre todos los nombres que coinciden con el patrón *.fastqen el directorio actual (es posible que desee ser más específico con este patrón, por ejemplo, cambiándolo a IDNR*.fastq). Para cada nombre de archivo, construye un nuevo nombre eliminando el prefijo que coincide con el patrón global del nombre de archivo *_*_*_. Esto se hace usandouna expansión de parámetros estándar.

Por seguridad, mvestá comentado. Debe ejecutar el código una vez para ver que hace lo correcto antes de habilitar el archivo mv.

Usando una de las diversas renameutilidades (la que está basada en el módulo de Perl File::Rename; hay varias diferentes, consulte "¿Qué pasa con todos los cambios de nombre: prenombre, cambio de nombre, cambio de nombre de archivo?"):

rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq

o más corto,

rename -n -v 's/(.*?_){3}//' -- *.fastq

Esto hace más o menos lo mismo que el código de shell anterior, pero usando una sustitución de Perl. La sustitución elimina los bits iniciales de la cadena del nombre del archivo al hacer coincidir las tres subcadenas entre los guiones bajos mediante una coincidencia no codiciosa .*. Elimine la -nopción cuando esté seguro de que hace lo correcto.

información relacionada