2009-06-22 9 views
13

Estoy cambio de nombre de extensiones de archivos vacíos con este comando:por lotes, incluyendo los subdirectorios

rename *. *.bla 

Sin embargo, tengo una carpeta con cientos de estos subcarpetas, y este comando me obliga a navegar manualmente a cada subcarpeta y ejecutarlo.

¿Existe un comando que pueda ejecutar desde una sola carpeta de nivel superior que incluirá todos los archivos en las subcarpetas?

+0

pertenece en serverfault –

+0

/yo creo que pertenece también aquí – jrharshath

Respuesta

2

Puede hacer esto y muchas cosas más fácilmente con el módulo Perl File::Find.

#!perl 

use strict; 
use warnings; 
use File::Find; 

my $extension = 'bla'; 
my $directory = '/tmp/test'; 

print "Files renamed:\n"; 
find(\&wanted, $directory); 

sub wanted { 
    return if /\./; 
    return unless -f $File::Find::name; 

    if (rename($File::Find::name, "$File::Find::name.$extension")) { 
     print " $File::Find::name -> $File::Find::name.$extension\n"; 
    } 
    else { 
     print " Error: $! - $File::Find::name\n"; 
    } 
} 
2

esto le permitirá ingresar directorios con espacios en los nombres. (Tenga en cuenta la doble% es para archivos por lotes, utilice un único% para las líneas de comandos.)

for /f "tokens=* delims= " %%a in ('dir /b /ad /s') do rename "%%a\*." "*.bla" 
+0

Dándome no reconoce como error de comando interno o externo . Usar solo% para la prueba de línea de comando. Parece bastante cercano, pero simplemente no lo está haciendo del todo. – Alan

+0

¿está utilizando el único% tanto para el bucle for como para el cambio de nombre? – akf

+0

Correcto. ¿Alguna suerte en tu lado? – Alan

0

probar este

for /R c:\temp %I in (*.) DO Echo rename %I "%~nI.bla" 
1

Puede utilizar for para iterar sobre subdirectorios:

for /d %x in (*) do pushd %x & ren *. *.bla & popd 

Al usarlo desde un archivo de proceso por lotes, deberá duplicar los signos %:

for /d %%x in (*) do pushd %%x & ren *. *.bla & popd 
+0

, ¿comenzará esto en el directorio actual si se emite desde la línea de comando? (Simplemente no desea derramar accidentalmente en el resto de la unidad) – Alan

+0

Sí. Si necesita que esté en un directorio fijo, puede alterar el comodín entre paréntesis para algo como para/d% x en (% perfil de usuario% \ foo \ *) do ... – Joey

7
for /r c:\path\ %G in (*.) do ren "%G" *.bla 
0

Utilizando encontrar y xargs y nombre base sería la expresión más fácil de leer

Prepare una secuencia de comandos shell de cambio de nombre como esto (corregido para manejar múltiples archivos)

#!/bin/sh 
if [ $# -lt 3 ] 
then 
    echo "usage: rename.sh sufold sufnew file1 (file2 file3 ...) " 
    exit 
fi 

sufold=$1 
sufnew=$2 
shift 
shift 

for f in $* 
do 
    echo "to mv " $f `dirname $f`"/"`basename $f $sufold`$sufnew 
    mv $f `dirname $f`"/"`basename $f $sufold`$sufnew 
done 

Luego puede invocar eso para cada archivo matche d sus criterios, incluyendo la búsqueda de carpetas recursiva por comando find

find . -name "*." | xargs rename.sh "." ".bla" 

Una muestra más común

find . -name "*.htm" | xargs rename.sh ".htm" ".html" 
Cuestiones relacionadas