2009-06-22 14 views
13

sto rinominare le estensioni dei file vuoti con questo comando:batch, tra cui le sottodirectory

rename *. *.bla 

Tuttavia, ho una cartella con centinaia di tali sottocartelle, e questo comando mi obbliga a navigare manualmente ad ogni sottocartella ed eseguirlo.

C'è un comando che posso eseguire da una sola cartella di livello superiore che includerà tutti i file nelle sottocartelle?

+0

appartiene a serverfault –

+0

/me pensano che appartiene anche qui – jrharshath

risposta

2

È possibile eseguire facilmente questa e molte altre cose con il modulo 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

questo vi permetterà di inserire dir con spazi nei nomi. (Notare il doppio% è per i file batch, utilizzare un unico% per le linee di comando.)

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

Dandomi non riconosce come errore di comando interno o esterno . Utilizzo di% singola per il test della riga di comando. Sembra abbastanza vicino, ma non è proprio così. – Alan

+0

stai utilizzando la singola% sia per il ciclo for che per la rinomina? – akf

+0

corretto. Qualche fortuna per la tua parte? – Alan

0

Prova questa

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

È possibile utilizzare for per scorrere sopra le sottodirectory:

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

Quando lo si utilizza da un file batch, è necessario raddoppiare i segni %:

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

quindi verrà avviato nella directory corrente se emesso dalla riga di comando? (solo non voglio versare accidentalmente nel resto del disco) – Alan

+0

Sì. Se hai bisogno che sia in una directory fissa, puoi modificare il carattere jolly tra parentesi con qualcosa come/d% x in (% userprofile% \ foo \ *) do ... – Joey

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

usando find e xargs e basename renderebbe l'espressione più facile da leggere

Preparare uno script di shell rename come questo (corretto per gestire più file)

#!/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 

Quindi è possibile invocarlo in ogni file matche d vostri criteri, tra cui la ricerca di cartelle ricorsiva dal comando find

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

Un campione più comune

find . -name "*.htm" | xargs rename.sh ".htm" ".html" 
Problemi correlati