Renombrar archivos y directorios (Agregar prefijo)

137

Me gustaría agregar un prefijo en todas las carpetas y directorios.

Ejemplo:

yo tengo

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/

Me gustaría agregar el prefijo "PRE_"

PRE_Hi.jpg
PRE_1.txt
PRE_folder/
PRE_this.file_is.here.png
PRE_another_folder.ok/

Saludos,

Rafael
fuente
Use AWK como en esta respuesta: awk '$ 0 = "prefix" $ 0' file> new_file
Marque el

Respuestas:

224

Gracias a Peter van der Heijden , aquí hay uno que funcionará para nombres de archivo con espacios en ellos:

for f in * ; do mv -- "$f" "PRE_$f" ; done

("-" es necesario para tener éxito con los archivos que comienzan con guiones, cuyos nombres se interpretarían como modificadores para el comando mv)

CanSpice
fuente
Je, cierto, esto no funcionará por completo si tienes un archivo con un espacio en él.
CanSpice
12
Si cambia el lscomando *y pone comillas dobles alrededor de los argumentos mv, funcionará para archivos que contengan espacios.
Peter van der Heijden
@CanSpice ¿Es posible revertir esta operación (eliminar el prefijo) con un script similar?
Pascal Qyy
3
Gracias amigo. El interno aquí estaba perdiendo las tapas de sus dedos renombrando los 67 archivos. Salud.
Felipe
1
Debe ser "mv -" no solo "mv", para protegerse de los archivos que comienzan con guiones, que de otro modo se interpretarían como interruptores de comando. Contribuiré con una edición para corregir esto.
Jacob C. dice Restablecer a Mónica el
81

Utilice el script de cambio de nombre de esta manera:

$ rename 's/^/PRE_/' *

No hay problemas con metacaracteres o espacios en blanco en los nombres de archivo.

tchrist
fuente
3
Algunos sistemas tienen una utilidad util-linux llamada "rename" que funciona de manera diferente (en Ubuntu se llama "rename.ul").
Pausado hasta nuevo aviso.
renameSiempre me ha ayudado a manejar múltiples cambios de nombre de archivos muy fácilmente.
Alan Haggai Alavi
61

Para agregar prefijo o sufijo para archivos (directorios), puede usar la forma simple y poderosa de xargs :

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

Está utilizando la opción de sustitución de parámetro de xargs: -I. Y puede obtener más detalles en la página del manual.

Zheng Qsin
fuente
2
PD: Si solo desea cambiar el nombre de los archivos de pieza (directorios) del directorio actual, simplemente filtre antes de xargs, como:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin
Curiosamente, el cambio de nombre no funcionó. el uso de xargs funcionó bien para mi configuración de RHEL, por lo que +1 para esta opción facilita la comprensión del comando
Acewin
No funciona si el nombre de archivo contiene comillas simples, falla con: xargs: comillas simples no coincidentes; por defecto, las comillas son especiales para xargs a menos que use la opción -0
Evgeny Veretennikov
36

Esto podría hacerse ejecutando un findcomando simple :

find * -maxdepth 0 -exec mv {} PRE_{} \;

El comando anterior prefijará todos los archivos y carpetas en el directorio actual con PRE_.

Código ciclónico
fuente
8

Para agregar un prefijo a todos los archivos y carpetas en el directorio actual utilizando util-linux rename(en lugar de prenamela variante perl de Debian y ciertos otros sistemas), puede hacer lo siguiente:

rename '' <prefix> *

Esto encuentra la primera aparición de la cadena vacía (que se encuentra inmediatamente) y luego reemplaza esa aparición con su prefijo, luego pega el resto del nombre del archivo al final de ese. Hecho.

Para sufijos , debe usar la versión perl o usar find .

koyae
fuente
util-linuxen Debian Stretch parece proporcionar esto como /usr/bin/rename.ul.
user1338062
7

Si tienes Ruby (1.9+)

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'
Kurumi
fuente
7

con Perl:

perl -e 'rename $_, "PRE_$_" for <*>'
tadmc
fuente
2

Aquí hay un script simple que puede usar. Me gusta usar el módulo no estándar File::chdirpara manejar las cdoperaciones de administración , por lo que para usar este script tal como está, necesitará instalarlo ( sudo cpan File::chdir).

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;
use File::chdir; # allows cd-ing by use of $CWD, much easier but needs CPAN module

die "Usage: $0 dir prefix" unless (@ARGV >= 2);
my ($dir, $pre) = @ARGV;

opendir(my $dir_handle, $dir) or die "Cannot open directory $dir";
my @files = readdir($dir_handle);
close($dir_handle);

$CWD = $dir; # cd to the directory, needs File::chdir

foreach my $file (@files) {
  next if ($file =~ /^\.+$/); # avoid folders . and ..
  next if ($0 =~ /$file/); # avoid moving this script if it is in the directory

  move($file, $pre . $file) or warn "Cannot rename file $file: $!";
}
Joel Berger
fuente
1

En mi sistema, no tengo el renamecomando. Aquí hay un simple trazador de líneas. Encuentra todos los archivos HTML de forma recursiva y agrega prefix_delante de sus nombres:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done
conradkleinespel
fuente
1
con findusted también puede ejecutar comandos, sin necesidad de un bucle: stackoverflow.com/a/33297439/2351568
DJCrashdummy
0

Esto prefijará sus archivos en su directorio.

El ${f%/*}es el camino hasta la última barra inclinada /-> el directorio

El ${f##*/}es el texto sin nada antes de la última barra inclinada /-> nombre de archivo sin la ruta

Así es como va:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
SteinAir
fuente