Quiero lote de re-nombre de un número de archivos en un directorio, de forma que el anterior y el guion son arrancados del nombre de archivo.

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW

¿Cómo puedo hacer esto con un comando en linux?

InformationsquelleAutor van | 2013-09-11

9 Comentarios

  1. 39

    Esto debería hacer:

    rename 's/^[0-9]*-//;' *

    Se pone desde el principio el bloque [0-9] (es decir, números) muchas veces, el guión - y se elimina el nombre de archivo.


    Si rename no está en su máquina, usted puede utilizar un bucle y mv:

    mv "$f" "${f#[0-9]*- }"

    De prueba

    $ ls
    23-aa  hello aaa23-aa
    $ rename 's/^[0-9]*-//;' *
    $ ls
    aa  hello aaa23-aa

    O:

    $ ls
    23-a  aa23-a  hello
    $ for f in *;
    > do
    >   mv "$f" "${f#[0-9]*- }"
    > done
    $ ls
    a  aa23-a  hello
    • Esto no funciona con mi versión de rename (util-linux-ng 2.17.2). Qué versión estás usando?
    • cambiar el nombre es de util-linux Fedora y Debian, pero no parece ser incluidos por defecto en OSX.
    • a mi me funciona en 2.23.2
    • comprobar mi respuesta actualizada, utilizando mv. Funciona para usted?
    • Sí, el mv comando funciona para mí. Parece que debe haber dos versiones de rename – mina requiere tres argumentos (rename from to file).
    • no estoy seguro de lo que quieres decir

  2. 19

    Creo que este comando sería mejor si se ejecuta el siguiente comando:

    ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv

    Aquí

    ls * – listas de archivos en la carpeta actual

    sed-e – ejecuta la expresión

    p; – impresiones de edad de nombre de archivo

    s/viejo-nombre/nuevo-nombre/ – producir nuevo nombre de archivo

    xargs -n2 – maneja dos argumentos para mv

    mv – recibe dos parámetros y hacer la operación de mover

    Recomendación: antes de ejecutar mv comprobar lo que haces es lo que se quiere lograr con echo.

    ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo

    Ejemplo siguiente cambia el nombre de

    SCCF099_FG.gz5329223404623884757.tmp a

    SCCF099_FG.gz

    ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp//g' | xargs -n2 echo
    ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp//g' | xargs -n2 mv
    • Super útil. Gracias!
    • Veo que esto es viejo; pero se puede romper lo que está pasando en esta línea? Aquí está mi entendimiento: en la llamada a sed, si dicen que hay 5 archivos presentes, la expresión de cadena que se imprime cada línea y, a continuación, imprime su búsqueda y reemplazado de copia inmediatamente debajo; luego, xargs analiza esta lista de 10 elementos ahora 2-en-un-tiempo, y pasa como argumentos a mv. Es ese derecho?
    • Ligera variación he utilizado para los nombres de archivo que contengan espacios: find . -print0 | sed -z -e 'p;s/old-name/new-name/' | xargs -n2 -0 mv.
  3. 6

    Si los primeros números siempre tienen la misma longitud:

    for F in *new ; do
        mv $F ${F:8}
    done

    La ${parameter:number} hace una subcadena de expansión toma la cadena partir de los 8 caracteres.

    Hay muchas otras de la cadena de las ediciones disponibles en las expansiones para manejar casos de otros.

  4. 3

    Utilizando renamer (Windows, Mac y Linux friendly):

    $ renamer --find '/\d+-(.*)/' --replace '$1' *

    Esto eliminará todos los números y el primer guión desde el principio de todos los archivos en el directorio actual.

    • Es posible instalar con dependencias ?
    • no estoy seguro de lo que quieres decir.. hay instrucciones de instalación en la renamer sitio.. ¿eso ayuda?
    • node package manager parece tener problemas con las dependencias del paquete, por lo que no se instalar sólo uno de los comandos, y el mecanismo nacional de prevención no instalar las dependencias en modo automático.
    • me corrió npm install -g renamer – instalado correctamente y funciona bien.. por favor asegúrese de tener la última node.js instalado.. si sigues teniendo problemas, plantear un problema aquí
  5. 1

    Esto puede parecer un poco complejo, pero es muy eficaz y funciona bien en ambos sistemas *nix y OSX sistemas. También actúa de forma recursiva, el cambio de nombre de los archivos en el directorio actual, así como todos los subdirectorios:

    find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
    cp temp1 temp2 && \
    vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s///" -c ":x" temp2 && \
    paste temp1 temp2 > temp3 && \
    vi -c ":g/^/s//mv /" -c ":x" temp3 && \
    sh ./temp3 && \
    rm temp1 temp2 temp3

    He aquí un desglose de lo que acaba de suceder:

    La primera línea le dice a encontrar (find) todos los archivos, empezando por los que están en el directorio actual (.), cuyo nombre coincide con el patrón (-regex) de «los números 7, seguido por un guión, seguido de 0 o más caracteres» ('.*/[0-9]\{7\}[-].*'), y escribir los nombres de los archivos y sus respectivos caminos (-print) a un archivo llamado temp1 (> temp1). Tenga en cuenta que el -print directiva probablemente no sea necesario en la mayoría de los casos, pero no duele nada.

    find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \

    A continuación, copie (cp) el contenido de temp1 a un archivo llamado temp2.

    cp temp1 temp2 && \

    A continuación, abra el archivo temp2 el uso de la vi editor de texto y dar vi dos comandos (usando -c para significar que cada nuevo comando):

    1. Comando #1:
      • De búsqueda de cada línea de temp2 (:g) para el mismo patrón que hemos buscado para arriba, excepto que esta vez el grupo de los resultados, utilizando paréntesis (\([0-9]\{7\}[-]\)\(.*\)).
      • Para cada uno de los línea, mueva el cursor al lugar donde se encontró la coincidencia y reemplazar todo el partido con el segundo grupo de la coincidencia de patrón (\2).
    2. Comando #2:
      • Guardar los cambios realizados a temp2 y cerrar el archivo (:x).

    El resultado de que, por ser este:

     vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s///" -c ":x" temp2 && \

    Ahora, concatenar las líneas de temp1 con los de temp2 (paste) y escribir cada uno de los nuevos combinados de la línea a un archivo llamado temp3 (> temp3).

    paste temp1 temp2 > temp3 && \

    A continuación, ejecute vi de nuevo, haciendo los mismos pasos que el anterior, excepto que esta vez la búsqueda para el principio de cada línea (^) dentro del archivo temp3 y agregar mv y un espacio a la derecha después (mv).

    vi -c ":g/^/s//mv /" -c ":x" temp3 && \

    A continuación, ejecute el contenido de temp3 (./temp3) como una secuencia de comandos de shell (sh).

    sh ./temp3 && \

    Finalmente, eliminar (rm) cada uno de los archivos temporales que hemos creado durante todo el proceso.

    rm temp1 temp2 temp3
  6. 1

    vimv le permite cambiar el nombre de varios archivos usando Vim capacidades de edición de texto.

    Entrar vimv abre un Vim ventana que enumera abajo todos los archivos y usted puede hacer la coincidencia de patrones, selección visual, etc para editar los nombres. Después de salir de Vim, los archivos se cambian de nombre.

    La screencast en el archivo LÉAME que se muestra cómo se resuelve cartel original de la pregunta.

    [Descargo de responsabilidad: yo soy el autor de la herramienta]

  7. 0

    Usted puede utilizar esta herramienta: rnm

    Código para hacer lo que quieres:

    rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'

    -fo es para el archivo en modo de sólo

    -dp es la profundidad de directorio ( -1 significa profundidad ilimitada).

    -rs es la cadena de reemplazo. \d+- regex se reemplaza con la cadena vacía.

    -ss es la cadena de búsqueda, que busca archivos con ^\d+- regex. (Puede ser omitido sin embargo, algunas inofensivas mensajes de error sería impresa en la pantalla).

Dejar respuesta

Please enter your comment!
Please enter your name here