Necesito cambiar el nombre de archivos de nombres como los de este

transform.php?dappName=Test&transformer=YAML&v_id=XXXXX

solo a este

XXXXX.txt

¿Cómo puedo hacerlo?

Entiendo que necesito más de una mv comando porque son al menos 25000 archivos.

InformationsquelleAutor | 2009-01-06

11 Comentarios

  1. 48

    Solución más fácil es utilizar «mmv»

    Se puede escribir:

    mmv "long_name*.txt" "short_#1.txt"

    Donde el «#1» se sustituye por lo que es coincidente con el primer comodín.
    Del mismo modo #2 se sustituye por el segundo, etc.

    Lo que no es algo como

    mmv "index*_type*.txt" "t#2_i#1.txt"

    Para cambiar el nombre de index1_type9.txt a t9_i1.txt

    mmv no es un estándar en muchas distribuciones de Linux, pero se puede encontrar fácilmente en la red.

    • Hay un mmv paquete para Debian, Ubuntu, Gentoo…
    • El mmv comando falta el segundo wild card. Debe ser mmv «índice de latipo.txt» «t#2_i#1.txt»
    • Si esta es tu primera vez usando mmv, es mejor probar primero mmv -n <match> <reescribir>, que le mostrará lo que haría sin reescribir nada.
    • Esta es una buena herramienta. Me gusta que tiene el alias de formas para copiar, enlazar, e incluso añadiendo archivos juntos.
    • Funciona muy bien en Windows con Cygwin
  2. 18

    Si usted está usando zsh también se puede hacer esto:

    autoload zmv
    zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'
    • Él usa bash, lo dijo…
    • Él hizo? Qué significa la etiqueta? No fue agregado por él
    • Incluso si él está usando bash él siempre puede ejecutar zsh y, a continuación, utilizar esta respuesta.
  3. 13

    Escribir un simple script de shell en el que la parte más difícil es sobrecargar el nombre.

    El esquema de la secuencia de comandos es fácil (la sintaxis de bash aquí):

    for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
    do
        mv $i <modified name>
    done

    Modificar el nombre tiene muchas opciones. Creo que la más sencilla es probablemente una awk one-liner como

    `echo $i  |  awk -F'=' '{print $4}'`

    así que…

    for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
    do
        mv $i `echo $i |  awk -F'=' '{print $4}'`.txt 
    done

    actualización

    Bien, como se señala más adelante, esto no necesariamente funcionará para una gran lista de archivos; la * voluntad de saturación de la línea de comandos límite de longitud. Así que, a continuación, utilice:

    $ find . -name 'transform.php?dappName=Test&transformer=YAML&v_id=*' -prune -print |
    while read
    do
        mv $reply `echo $reply |  awk -F'=' '{print $4}'`.txt 
    done
    • +1, este es el enfoque general.
    • hay un comando para este llamado «cambiar nombre» en la mayoría de distribuciones de linux. Ver brien respuesta.
    • Tal vez sea así, pero no todos los sistemas UNIX (no en mi Mac por ejemplo), y este es un patrón general que puede aplicarse a otras cuestiones.
    • Al menos en Bash y el Tablero, un for bucle encima de un glob (o cualquier builtin, en que) no está sujeto a la «línea de comandos demasiado larga» limitación», de modo que el primer enfoque sería también trabajo para una muy larga lista de archivos, consulte esta respuesta.
  4. 5

    Probar el cambiar el nombre de comando

    O podría canalizar los resultados de un ls en un perl de regex.

    • Y cómo es exactamente lo que puede hacer que con el rename comando a lo largo de?
    • como esto: cambiar el nombre de transformar.php\?dappName\=Prueba de\&transformador\=YAML\&v_id\= » transform.php*
    • Como entiendo la pregunta, el resultado debe ser: s/.*?v_id=(.*)/$1.txt/. No veo que en tu comentario.
    • Ah, se me perdió el ‘.txt’ extensión. Parece que no hay manera fácil de agregar que el uso de «cambiar nombre».
  5. 4

    Usted puede usar lo que se desea transformar el nombre (perl, sed, awk, etc.). Voy a usar python one-liner:

    for file in 'transform.php?dappName=Test&transformer=YAML&v_id='*; do 
        mv $file `echo $file | python -c "print raw_input().split('=')[-1]"`.txt;
    done

    Aquí es el mismo guión completamente en Python:

    import glob, os
    PATTERN="transform.php?dappName=Test&transformer=YAML&v_id=*"
    
    for filename in glob.iglob(PATTERN):
          newname = filename.split('=')[-1] + ".txt"
          print filename, '==>', newname
          os.rename(filename, newname)

    Lado nota: usted hubiera tenido una vida más fácil guardar las páginas con el nombre correcto, mientras que agarrar ellos…

    • Ja ja, mi programa awk es más corto. 😉
    • A la derecha 🙂 awk es perfecto para este tipo de trabajos. Por desgracia, ni su sh script ni la mía va a trabajar para 100000 archivos (hay un límite de un comando de la longitud de la línea, y el * puede romper ese límite). Si este es el caso, cambiar el nombre o una dedicar script son las mejores soluciones.
    • Me gustaría añadir que la secuencia de comandos de Python (glob.iglob()) tiene una mejor oportunidad de trabajo para 100000 archivos.
  6. 4
    find -name '*v_id=*' | perl -lne'rename($_, qq($1.txt)) if /v_id=(\S+)/'
    • Casi podríamos hacer una página web dedicada a varias maneras de hacer esto.
  7. 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.

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

  8. 0

    Yo uso la ren-regexp, que es un script en Perl que permite que usted masa-cambiar el nombre de archivos muy fácilmente.

    21:25:11 $ ls
    transform.php?dappName=Test&transformer=YAML&v_id=12345
    
    21:25:12 $ ren-regexp 's/transform.php.*v_id=(\d+)/$1.txt/' transform.php*
    
      transform.php?dappName=Test&transformer=YAML&v_id=12345
    1 12345.txt
    
    
    21:26:33 $ ls
    12345.txt
  9. -1

    También debería funcionar:

    prfx=’transformar.php?dappName=Test&transformador=YAML&v_id=’

    ls $prfx* | sed » s/$prfx//| xargs -Ipsx mv «$prfx»de psx psx

  10. -1

    este renamer comando sería:

    $ renamer --regex --find 'transform.php?dappName=Test&transformer=YAML&v_id=(\w+)' --replace '$1.txt' *
  11. -9

    Aceptar, usted necesita para ser capaz de ejecutar un binario para windows por este.

    Pero si puede ejecutar Total Commander, hacer esto:

    1. Seleccionar todos los archivos con *, y golpeó ctrl-M

    2. En el Búsqueda campo, pegar «transformar.php?dappName=Test&transformador=YAML&v_id=»

      (Dejar Reemplazar vacío)

    3. De Prensa Inicio

    No se puede pedir mucho más sencillo que eso.
    También puede cambiar el nombre utilizando expresiones regulares a través de este cuadro de diálogo y ver una vista previa en tiempo real de cómo sus archivos se van a cambiar de nombre.

    • Él empezó su pregunta «unix»…
    • Yo estoy acceso a los sistemas unix de mi escritorio de windows todo el tiempo… Justo lo que sugiere la forma que yo he resuelto este.
    • Whoa, después de todos estos años todavía estoy recibiendo downvotes para este. 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here