Cambiar el nombre de los archivos en la carpeta local agregando un prefijo o sufijo

12

Tengo muchos archivos en una carpeta y quiero agregarles un prefijo o un sufijo (no ambos ). Lo comprobé aquí y descubrí que puedo usar

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

para agregar un prefijo a todos los archivos que terminan en .jpg(y si elimino el .jpg, agregará el prefijo a todos los archivos en la carpeta actual).

Sin embargo, me gustaría poder

  • Agregue un sufijo (es decir, cambie el nombre filename.exta filename.whatever.ext),
  • Compruebe si el prefijo o sufijo ya está presente y luego omita,
  • Cree un alias que acepte argumentos como addprefix whatever *.extoaddsufix whatever *.*
Ese chico brasileño
fuente

Respuestas:

10

Si usted está utilizando bash, entonces esto de una sola línea puede hacerlo por usted (suponiendo que tiene las variables $prefix, $suffixy $extensionfácilmente disponible)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Podrías hacer que tus guiones sean así

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

y

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done
Aaron Okano
fuente
Eso es casi perfecto! Sería perfecto si (1) verificara si el prefijo o sufijo ya está presente (y luego se omite), y (2) funcionó en archivos sin extensión. Perdón por molestar tanto ...
Ese tipo brasileño
Para (1) podría (creo que no probado) agregar la verificación de prefijo envolviendo el mv en un if [ $f == $prefix* ]y puede cambiar el sufijo uno con if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]alrededor de los comandos mv par en adduffix. Para (2) ya debería funcionar en archivos sin extensión, a menos que sea un programador horrible.
Aaron Okano
7

Hay un comando Perlrename que debería hacer el truco. Sin embargo rename, tenga cuidado: hay varios comandos diferentes llamados , así que asegúrese de tener el script Perl que espera un perlexprcomo argumento. Este es el renamecomando proporcionado por el perlpaquete en Debian y derivados (Ubuntu, Mint, ...), pero no en otras distribuciones que pueden tener una utilidad diferente llamada rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Como puede ver, es idempotente : no volverá a agregar el prefijo cuando lo llame varias veces.

Funciona reemplazando el inicio (longitud cero) de las cadenas ( ^) o el inicio seguido de una prefixcadena opcional con prefix.

Dejaré encapsular esto en un script de shell o una función de shell como un ejercicio para ti :)

Sin embargo, Postfix es un poco más difícil, porque tienes que descubrir qué parte del nombre de archivo constituye la extensión ...

Martin von Wittich
fuente
Esa es una buena respuesta, pero estaba buscando algo más universal; para esta respuesta necesitas tanto perl como este específico (o equivalente) renamepresente. Y sé que los sufijos son un poco más difíciles, no se cubrieron en la pregunta vinculada, y soy un principiante en Linux, bash, script de shell, perl y expresiones regulares, por lo que "un poco más difícil" es bastante difícil para mí. ! :)
Ese tipo brasileño
4

Con zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~es el operador global que significa excepto en zsh.

Stéphane Chazelas
fuente
1

Ejemplo simple para cambiar el prefijo y la extensión de todas las imágenes en la carpeta actual.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Si desea verificar cómo afectaría sus datos antes de cambiarlos, reemplace el mv por echo

la salida para IMG_7993.JPG es EG_IMG_7993.jpg

Jinxi
fuente