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,


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)


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


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.


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_.


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 .


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) }'

7

con Perl:

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

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: $!";
}

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.