2011-01-24 43 views
83

Me gustaría agregar el prefijo en todas las carpetas y directorios.Renombrar archivos y directorios (Agregar prefijo)

Ejemplo:

tengo

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

me gustaría añadir el prefijo "PRE_"

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

Saludos,

Respuesta

136

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

for f in * ; do mv "$f" "PRE_$f" ; done 
+1

tenga cuidado con los nombres de archivo con espacios en ellos ... – Alnitak

+0

Heh, cierto, esto no funcionará por completo si tiene un archivo con un espacio en él. – CanSpice

+10

Si cambia el comando 'ls' a' * 'y pone comillas dobles alrededor de los argumentos a' mv', funcionará para los archivos que contienen espacios. –

69

Uso the rename script esta manera:

$ rename 's/^/PRE_/' * 

No hay problemas con meta-caracteres o espacios en blanco en los nombres de archivo.

+2

Algunos sistemas tienen una utilidad util-linux llamada "rename" que funciona de manera diferente (en Ubuntu se llama "rename.ul"). –

+0

'rename' siempre me ha ayudado a manejar múltiples nombres de archivo con mucha facilidad. –

6

Si tiene Rubí (1.9+)

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

con Perl:

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

Aquí es un simple script que puede utilizar. Me gusta utilizar el módulo no estándar File::chdir para gestionar las operaciones de gestión cd, por lo que para utilizar este script tal cual, deberá 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: $!"; 
} 
45

Para añadiendo el prefijo o sufijo de archivos (directorios), se puede utilizar la forma más sencilla y potente por xargs:

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

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

está utilizando la opción paramerter-sustitución de xargs : -YO. Y puede obtener más detalles de la página del manual.

+2

P.S .: Si solo desea ** cambiar el nombre de los archivos de pieza ** (directorios) del directorio actual, simplemente filtre antes de xargs, como por ejemplo: 'ls * .old | xargs -I {} mv {} PRE _ {} ' –

+0

interesante usar el cambio de nombre no funcionó. Usar xargs fue bien para mi configuración de RHEL, así que +1 para esta opción, hace que sea fácil entender el comando – Acewin

1

En mi sistema, no tengo el comando rename. Aquí hay un trazador de líneas simple. Se encuentra todos los archivos HTML de forma recursiva y añade prefix_ delante de sus nombres:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done 
17

Esto se podría hacer correr un simple find comando:

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

El comando anterior delante de todos los archivos y carpetas en el directorio actual con PRE_.

7

Para añadir un prefijo a todos los archivos y carpetas en el directorio actual utilizando de util-linux rename (en contraposición a prename, la variante de Perl de Debian y otros sistemas), que puede hacer:

rename '' <prefix> * 

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

Para sufijos, necesita use the perl version o use find.

0

Esto prefijará sus archivos en su directorio.

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

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

Así que eso es lo que pasa:

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