¿Cómo cambio fácilmente el nombre de varios archivos usando la línea de comandos?

103

Una de las formas en que renombre rápidamente los archivos en Windows es

F2 > Rename > Tab (to next file) > Rename ...

Pero en Ubuntu / Nautilus, no puedo pasar al siguiente archivo. Pero al estar en Linux, creo que debe haber una alternativa de línea de comando.

Sin embargo, a veces, es posible que desee tener más control sobre cómo cambiar el nombre de archivos específicos. En ese caso, quizás sea mejor poder pasar al siguiente archivo

Jiew Meng
fuente
1
¿Podría definir "más control"? No estoy seguro de lo que estás preguntando exactamente ..
Dang Khoa
Creo que esta pregunta no tiene respuesta. Lo que está pidiendo (F2 y luego saltar en modo F2 al siguiente archivo) actualmente no está disponible, creo que en Nautilus.
don.joey

Respuestas:

189

Yo uso renametodo el tiempo. Es bastante simple, pero espero que conozcas expresiones regulares básicas:

rename "s/SEARCH/REPLACE/g"  *

Esto reemplazará la cadena SEARCHcon REPLACEen cada archivo (es decir, *). El /gmedio global, por lo que si tuviera un SEARCH_SEARCH.jpg, sería renombrado REPLACE_REPLACE.jpg. Si no lo hubiera hecho /g, solo habría hecho una sustitución una vez y, por lo tanto, ahora se nombraría REPLACE_SEARCH.jpg. Si desea no distinguir entre mayúsculas y minúsculas, agregue /i(eso sería, /gio /igal final).

Con expresiones regulares, puedes hacer mucho más.

Tenga en cuenta que este renamees el comando prename(también conocido como Perl rename), que admite expresiones regulares completas de Perl. Hay otro renameque usa patrones y no es tan poderoso. prenamesolía instalarse de manera predeterminada en Ubuntu (junto con Perl), pero ahora puede que tenga que hacer:

sudo apt install rename

Aquí están algunos ejemplos:

Prefijo

Añadir :

rename 's/^/MyPrefix_/' * 
  • document.pdf renombrado a MyPrefix_document.pdf

Eliminar :

También puede eliminar cadenas no deseadas. Supongamos que tiene 20 archivos MP3 con el nombre Me gusta CD RIP 01 Song.mp3y desea eliminar la parte "RIP CD" y desea eliminarlos de todos ellos con un solo comando.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 a 01 Song.mp3

Observe el espacio extra en '^CD RIP ', sin el espacio todos los archivos tendrían un espacio como primer carácter del archivo. También tenga en cuenta que esto funcionará sin el ^carácter, pero coincidiría CD RIP en cualquier parte del nombre de archivo. Las ^garantías solo eliminan los caracteres si son el comienzo del archivo.

Sufijo

Añadir :

rename 's/$/_MySuffix/' *
  • document.pdf renombrado a document.pdf_MySuffix

Cambio :

rename 's/\.pdf$/.doc/' *

cambiará Something.pdfa Something.doc. (La razón de la barra diagonal inversa es que .es un carácter comodín en regexp, por lo que .pdfcoincide, qPDFmientras que \.pdfsolo coincide con la cadena exacta .pdf. También es muy importante tener en cuenta que si no está familiarizado con BASH, debe colocar barras diagonales inversas entre comillas. ¡No puede omitir comillas! o utilice comillas dobles, o bash intentará traducirlas. Para bash \. e "\." iguales .. (Pero se utilizan comillas dobles y barras invertidas, por ejemplo, "\ n" para una nueva línea, pero como "\."no es una secuencia de escape posterior válida, se traduce en .)

En realidad, incluso puede encerrar las partes de la cadena entre comillas en lugar de todo: 's/Search/Replace/g'es lo mismo que s/'Search'/'Replace'/gy s/Search/Replace/gpara BASH. Solo debes tener cuidado con los caracteres especiales (y espacios).


Sugiero usar la -nopción cuando no estés seguro de que tienes las expresiones regulares correctas. Muestra lo que sería renombrado, luego sale sin hacerlo. Por ejemplo:

rename -n s/'One'/'Two'/g *

Esto enumerará todos los cambios que habría realizado, si no hubiera puesto la -nbandera allí. Si se ve bien, presione Uppara regresar, luego borre -ny presione Enter(o reemplácelo -vpara generar todos los cambios que realice).

Nota : las versiones de Ubuntu anteriores a la 17.04 no se envían renamede manera predeterminada, sin embargo, todavía está disponible en los repositorios. Use sudo apt install renamepara instalarlo

Mate
fuente
¿Cómo tendré un sufijo "dinámico"? Como 001 - 010 etc. ¿Posible?
Jiew Meng
Hmm ... intenté escribir algo pero no funcionó. Principalmente porque, cuando agrego 1 a 001, agrega 2, no 002. De lo contrario, podría usar variables para mantener la posición del número y luego agregarla. Además, me acabo de acordar, antes de saber sobre el renamecomando, esto es lo que hice para agregar:for f in *; do mv -v "$f" "prependThis$f"; done
Matt
2
@jiewmeng Sí. Úselo (?:\.[0-9]{3})$en su patrón, coincidirá con todas las extensiones de archivo de 3 dígitos en un grupo pasivo. Ejemplo: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Echa un vistazo a esta hoja de trucos regex .
sergio91pt
@ sergio91pt es una buena hoja de trucos regex. ¿Pero de qué se trata? Debe ser perl, pero no puedo encontrar esa nota allí.
Adobe
@ Adobe es general para "expresiones regulares basadas en perl". Mire la nota sobre el signo + y la columna sobre las clases de caracteres POSIX.
sergio91pt
21

Prueba pyrenamer .

No está integrado con nautilus, pero hace el trabajo. Aquí hay una reseña.

Thunar (parte de XFCE) también tiene un renombrador que puede ejecutar por separado.

Renombrador a granel Thunar

RolandiXor
fuente
2
Gracias por mencionar la funcionalidad Thunar. Si tiene Thunar: seleccione los archivos en la carpeta y presione F2.
Max
9

Parece que hay un proyecto en el launchpad llamado nautilus-renamer . Puede instalarlo ejecutando make installuna vez que descargue el script y lo descomprima. Parece que tiene algunas funcionalidades o si sabe algo de programación, podría mejorarla según sus necesidades, ya que es solo un script de Python.

ingrese la descripción de la imagen aquí

sagarchalise
fuente
8

En la línea de comando, para cambiar el nombre de un solo archivo, el comando es simplemente

mv file1.txt file2.txt

Si desea hacerlo en lote, probablemente querrá hacerlo a través de un script. Si proporciona más detalles, yo u otra persona probablemente podamos prepararle uno. Dicho esto, un script para agregar cosas a un archivo podría verse así:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

Dependiendo exactamente de cómo necesita cambiar el nombre de las cosas, esto probablemente se modificará, por ejemplo, si tiene que seguir reglas específicas de cambio de nombre. (Personalmente, haría esto a través de un script de Perl ya que mi bash-foo no es tan bueno, pero solo soy yo).

Tenga en cuenta que obtuve la separación de nombre de archivo y extensión de una pregunta anterior .

Dang Khoa
fuente
7

En caso de que desee hacerlo sin línea de comando, de manera similar a lo que ha estado haciendo en Windows, use la tecla de flecha derecha en lugar de la tecla de tabulación . Esto seleccionará el siguiente archivo tal como lo hace la pestaña en Windows.

Rafał Cieślak
fuente
No es lo mismo: aún necesitaría ENTER para finalizar el cambio de nombre, la tecla de flecha para pasar al siguiente archivo y F2 para cambiarle el nombre. TAB lo hace en 1 paso una vez que renombra un archivo.
MestreLion
@MestreLion Pero es muy similar al algoritmo descrito en la pregunta y no requiere ningún software adicional ni operaciones de línea de comandos. Una especie de ser fácil de usar.
Rafał Cieślak
Es cierto, usted fue la única respuesta que al menos intentó el mismo enfoque que la pregunta original. Y la triste verdad es que Nautilus no tiene esa funcionalidad. Puedes cambiar el nombre de F2, pero eso es todo. Sin TAB para saltar automáticamente al siguiente archivo en modo renombrar.
MestreLion
7

No es realmente la misma pregunta que ¿Cómo puede cambiar el nombre de muchos archivos a la vez? pero voy a sugerir el mismo programa que sugerí en esa respuesta: qmv .

qmv es una herramienta útil del paquete renameutils. Le permite usar su editor de texto favorito para cambiar el nombre de los archivos. Combinado con el poder de vim, tiene una excelente utilidad de cambio de nombre.

Por lo general, lo invoco como qmv -f doen el directorio donde quiero cambiar el nombre de un grupo de archivos. O si quiero renombrar recursivamente qmv -R -f do.

Siempre que necesito cambiar el nombre de varios archivos, siempre recurro a qmv (y vim).

http://www.nongnu.org/renameutils/

dempa
fuente
Acabo de probar esto en base a su sugerencia. ¡Esta es realmente la herramienta más increíble si usas vim!
ste_kwr
3

Si la única opción adecuada es renombrar los archivos manualmente, una excelente manera de hacerlo es usar vidir(en el moreutilspaquete):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Ejemplos


Renombrar archivos selectivamente

Contenido actual del directorio de trabajo:

.
├── bar
├── baz
└── foo

Ejecute vidir, cambie el nombre de los nombres de archivo en las líneas que contienen los nombres de archivo que desea cambiar de nombre; presione CTRL+ Oy CTRL+ X:

captura de pantalla3

.
├── bar.bak
├── baz.old
└── foo.new

Cambiar nombres de archivo selectivamente

Contenido actual del directorio de trabajo:

.
├── bar
├── baz
└── foo

Contenido actual de los archivos del directorio de trabajo:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Ejecutar vidir, cambie los números en las líneas que contienen los nombres de archivo que desea cambiar; presione CTRL+ Oy CTRL+ X:

captura de pantalla4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Eliminar archivos selectivamente

Contenido actual del directorio de trabajo:

.
├── bar
├── baz
└── foo

Ejecute vidir, elimine las líneas que contienen los archivos que desea eliminar; presione CTRL+ Oy CTRL+ X:

screenshot2

.
└── baz
kos
fuente
2

Estoy usando krename. Es una aplicación GUI. Podía leer etiquetas mp3, etc.

Existe como una aplicación separada, así como una parte de Krusader.

También hay un renamescript, que forma parte de la instalación estándar de Perl (probablemente lo tenga instalado). Compruébalo con man rename.

Adobe
fuente