Tengo un archivo de estructura que se parece a:

A/
    2098765.1ext
    2098765.2ext
    2098765.3ext
    2098765.4ext
      12345.1ext
      12345.2ext
      12345.3ext
      12345.4ext

B/
    2056789.1ext
    2056789.2ext
    2056789.3ext
    2056789.4ext
      54321.1ext
      54321.2ext
      54321.3ext
      54321.4ext

Necesito cambiar el nombre de todos los archivos que comienzan con 20 para iniciar con 10; es decir, necesito cambiar el nombre de B/2022222.1ext a B/1022222.1ext

He visto a muchas otras preguntas con respecto a cambiar el nombre de varios archivos, pero no podía hacer que funcione para mi caso. Sólo para ver si puedo averiguar lo que estoy haciendo antes de realmente tratar de hacer el copiar/cambiar el nombre que he hecho:

for file in "*/20?????.*"; do
    echo "{$file/20/10}";
done

pero todo lo que veo es

{*/20?????.*/20/10}

Puede que alguien me muestre cómo hacer esto?

archivo de bolas no son expresiones regulares.
Bien, me gustaría utilizar expresiones regulares, porque no puedo averiguar cómo hacer que funcione con globos.

OriginalEl autor jlconlin | 2013-02-13

5 Comentarios

  1. 18

    Usted acaba de tener un poco de sintaxis incorrecta es todo:

    for file in */20?????.*; do mv $file ${file/20/10}; done
    1. Eliminar citas del argumento a in. De lo contrario, el nombre de archivo de expansión no se produce.
    2. La $ en la sustitución debe ir antes de el soporte
    El amor de la manera simple de hacer esto.
    ¿usted sabe de una página que explica el tipo de regex/comodín reglas que se aplican en ${file/20/10}? parece regex y bash comodines a veces están en conflicto

    OriginalEl autor Explosion Pills

  2. 10

    Aquí es una solución que utiliza el find comando:

    find . -name '20*' | while read oldname; do echo mv "$oldname" "${oldname/20/10}"; done

    Este comando no realmente hacer su hacer una oferta, sólo se imprime lo que se debe hacer. Revise la salida y si eres feliz, quitar el echo comando y ejecutarlo para que el real.

    Ojalá pudiera haber aceptado dos respuestas. Elegí el otro porque era más simple.

    OriginalEl autor Hai Vu

  3. 0

    El pegote comportamiento de * se suprime en comillas dobles. Probar:

    for file in */20?????.*; do
        echo "{$file/20/10}";
    done
    Esto sólo anexa «/20/10» a cada uno de los nombres de archivo.

    OriginalEl autor William Pursell

  4. 0

    Llave de expansiones como :

    {*/20?????.*/20/10}

    no puede ser rodeado por comillas.

    Lugar, trate de hacer (con Perl rename) :

    rename 's/^10/^20/' */*.ext 

    Usted puede hacer esto usando el Perl de la herramienta de cambiar de la shell de símbolo del sistema. (Hay otras herramientas con el mismo nombre, que puede o no puede ser capaz de hacer esto, así que ten cuidado.)

    Si quieres hacer una marcha en seco para asegurarse de que usted no darle una paliza a cualquiera de los archivos, añadir el -n interruptor para el comando.

    nota

    Si se ejecuta el siguiente comando (linux)

    $ file $(readlink -f $(type -p rename))

    y un resultado como

    .../rename: Perl script, ASCII text executable

    a continuación, esta parece ser la herramienta correcta =)

    Este parece ser el predeterminado rename comando en Ubuntu.

    Para que sea el predeterminado en Debian y derivados como Ubuntu :

    sudo update-alternatives --set rename /path/to/rename
    Es allí una manera de hacer rename hacer una marcha en seco, así que sé lo que está haciendo antes de hacerlo? No quiero echar a perder lo que ya tengo.
    Ver mi post editado.

    OriginalEl autor Gilles Quenot

  5. 0

    Sólo quiero añadir a la Explosión de la Píldora de la respuesta.
    En OS X, sin embargo, usted debe decir

    mv "${file}" "${file_expression}"

    O la mv comando no la reconoce.

    OriginalEl autor Virgil Ming

Dejar respuesta

Please enter your comment!
Please enter your name here