Tengo los siguientes archivos en el formato siguiente:

$ ls CombinedReports_LLL-*'('*.csv
CombinedReports_LLL-20140211144020(Untitled_1).csv
CombinedReports_LLL-20140211144020(Untitled_11).csv
CombinedReports_LLL-20140211144020(Untitled_110).csv
CombinedReports_LLL-20140211144020(Untitled_111).csv
CombinedReports_LLL-20140211144020(Untitled_12).csv
CombinedReports_LLL-20140211144020(Untitled_13).csv
CombinedReports_LLL-20140211144020(Untitled_14).csv
CombinedReports_LLL-20140211144020(Untitled_15).csv
CombinedReports_LLL-20140211144020(Untitled_16).csv
CombinedReports_LLL-20140211144020(Untitled_17).csv
CombinedReports_LLL-20140211144020(Untitled_18).csv
CombinedReports_LLL-20140211144020(Untitled_19).csv

Me gustaría que esta parte eliminado:

20140211144020 (esta es la fecha y hora de elaboración de los informes de ejecución por lo que este puede variar)

y terminar con algo como:

CombinedReports_LLL-(Untitled_1).csv
CombinedReports_LLL-(Untitled_11).csv
CombinedReports_LLL-(Untitled_110).csv
CombinedReports_LLL-(Untitled_111).csv
CombinedReports_LLL-(Untitled_12).csv
CombinedReports_LLL-(Untitled_13).csv
CombinedReports_LLL-(Untitled_14).csv
CombinedReports_LLL-(Untitled_15).csv
CombinedReports_LLL-(Untitled_16).csv
CombinedReports_LLL-(Untitled_17).csv
CombinedReports_LLL-(Untitled_18).csv
CombinedReports_LLL-(Untitled_19).csv

Yo estaba pensando simplemente, a lo largo de las líneas de la mv comando, tal vez algo como esto:

$ ls CombinedReports_LLL-*'('*.csv

pero tal vez una sed comando u otro sería mejor

OriginalEl autor HattrickNZ | 2014-02-11

5 Comentarios

  1. 12

    rename es parte de la perl paquete. Se cambia el nombre de los archivos según el perl de estilo de expresiones regulares. Para quitar las fechas a partir de los nombres de archivo:

    rename 's/[0-9]{14}//' CombinedReports_LLL-*.csv

    Si rename no está disponible, sed+shell puede ser utilizado:

    for fname in Combined*.csv ; do mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')" ; done

    El de arriba se repite a lo largo de cada uno de sus archivos. Para cada archivo, se realiza un mv comando: mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')" donde, en este caso, sed es capaz de utilizar la misma expresión regular como rename comando anterior. s/[0-9]{14}// dice sed a buscar 14 dígitos en una fila y reemplazarlos con una cadena vacía.

    No hay necesidad de sed, una moderna shell puede hacer sus propios cambios incorporados.
    Yo generalmente objetivo para el Tablero de compatibilidad no sólo porque es mucho más rápido que bash pero también debido a que simple shell es mucho más amplio apoyo. (2) mientras Bash puede hacer primitivo sustituciones, sed regex son en última instancia mucho más potente.
    El Pse disponible en POSIX sh, y por lo tanto de guión, son suficientes para este trabajo en particular. Por supuesto, usted no puede hacer reemplazos, pero puede filtro de comienzo y final de las cadenas y combinarlos. Como para la afirmación de que la sed expresiones regulares son más poderosas bash se ha incorporado en el soporte regex (ver BASH_REMATCH), y tiene un modo en el que sus globos son comparables en el poder a Bras (ver extglob).
    …la gran diferencia, sin embargo, es la eficiencia; si fueron repitiendo a lo largo de cientos de archivos, la penalización de tiempo de que se bifurcan en un subshell, exec ing sed dentro de ella, wait()ing para que subshell para completar, read()ing su salida, etc. se acumula rápidamente.
    …además, hay efectos secundarios a la utilización de la sustitución de comandos-en cualquier momento de utilizar $(foo), caracteres finales en IFS se eliminan, por lo que un nombre de archivo que termina con un espacio en blanco tendría que espacios en blanco pelado, incluso si ese no es el comportamiento deseado.

    OriginalEl autor John1024

  2. 6

    Sin uso de otras herramientas como rename o sed y apegarse estrictamente a bash solo:

    for f in CombinedReports_LLL-*.csv
    do
      newName=${f/LLL-*\(/LLL-(}
      mv -i "$f" "$newName"
    done
    +1. Pero, ¿por qué no poner a todos en el comando mv directamente? mv -i "$f" "${f/LLL-*\(/LLL-(}"
    Por qué? Para mayor claridad de curso. Buscar en los corazones y las mentes de los compañeros de programador y supongo que la solución será entendido mejor. Mi conjetura es, por la forma OP poner su pregunta, que entendería mejor con la palabra a nombre de la variable como newName.
    lo consiguió. Hacer claramente de OP.
    Es que una expresión regular? O algunos de bash tipo específico? Yo no puedo encontrar ninguna documentación en una fiesta específica de la expresión del lenguaje, pero no entiendo por qué LLL se repite o el segundo corchete de apertura.
    No es un regexp. Es más o menos un pegote-patrón de reemplazo. Ver man bash y la búsqueda de Pattern substitution.

    OriginalEl autor Alfe

  3. 1
    for f in CombinedReports_LLL-* ; do
        b=${f:0:20}${f:34:500}
        mv "$f" "$b"
    done

    Puede intentar línea por línea en el shell:

    f="CombinedReports_LLL-20140211144020(Untitled_11).csv"
    b=${f:0:20}${f:34:500}
    echo $b
    Esperemos que todos los números (las marcas) son de la misma anchura. Y aún así, nadie lectura que el código se tiene que adivinar donde los constantes (0, 20, 34, y 500) han venido y lo que significan. No es imposible adivinar por supuesto, pero no es la forma más clara de decirlo.

    OriginalEl autor Pedro Nunes

  4. 0

    Puede utilizar el rename utilidad para esto. Se usa la sintaxis mucho como sed para cambiar los nombres de archivo. El siguiente ejemplo (desde el cambio de nombre de hombre-page) muestra cómo quitar la cola ‘.bak’ extensión de una lista de archivos de copia de seguridad en el directorio local:

    rename 's/\.bak$//' *.bak
    no tiene la rename comando en mi versión de cygwin en el minuto. de otra manera?

    OriginalEl autor Kevin

  5. 0

    Estoy usando los consejos que se dan en la parte superior de respuesta y han puesto la siguiente línea en un script de shell:

    ls *.nii | xargs rename 's/[f_]{2}//' f_0*.nii

    En la terminal, esta línea funciona perfectamente, pero en mi script no se ejecutará y lee * como parte literal del nombre de archivo.

    OriginalEl autor user5318429

Dejar respuesta

Please enter your comment!
Please enter your name here