2009-06-22 12 views
13

Ich Umbenennung leere Dateierweiterungen mit diesem Befehl:Batch Umbenennungsdateierweiterungen, einschließlich Unterverzeichnisse

rename *. *.bla 

Allerdings habe ich einen Ordner mit Hunderten solcher Unterordner und dieser Befehl verlangt, dass ich manuell zu jedem navigieren Unterordner und führen Sie es aus.

Gibt es einen Befehl, den ich von nur einem übergeordneten Ordner ausführen kann, der alle Dateien in den Unterordnern enthält?

+0

auf serverfault gehört –

+0

/me denke, es hier zu – jrharshath

Antwort

2

Mit dem Perl-Modul File::Find können Sie dies und noch viel mehr erledigen.

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

dies ermöglicht es Ihnen dirs mit Leerzeichen in den Namen einzugeben. (Man beachte die doppelte% für Batch-Dateien ist, ein einzelnes% für Befehlszeilen verwenden.)

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

gehört mir Geben erkennt nicht als interner oder externer Befehl Fehler . Verwenden von Single% für den Befehlszeilen-Test. Scheint ziemlich nah, aber es tut es nicht ganz. – Alan

+0

Sie verwenden die einzige% für die For-Schleife und die Umbenennung? – akf

+0

Korrigieren. Hast du Glück am Ende? – Alan

0

Versuchen Sie, diese

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

Sie for über Unterverzeichnisse iterieren verwenden können:

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

Wenn Sie es aus einer Batch-Datei verwenden, müssen Sie die % Zeichen:

zu verdoppeln
+0

also wird dies im aktuellen Verzeichnis starten, wenn es von der Kommandozeile ausgegeben wird? (nur nicht versehentlich in den Rest des Laufwerks verschütten) – Alan

+0

Ja. Wenn Sie es in einem festen Verzeichnis benötigen, können Sie den Platzhalter in den Klammern in etwas wie/d% x in (% userprofile% \ foo \ *) ändern. – Joey

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

finden Verwendung und xargs und Basisnamen würde der Ausdruck einfacher machen

Bereiten Sie eine Umbenennungs Shell-Skript wie folgt zu lesen (korrigiert um mehrere Dateien zu handhaben)

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

Dann könnten Sie das auf jede Datei matche aufrufen d Ihren Kriterien, einschließlich rekursiven Ordnersuche durch Befehl find

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

Eine gemeinsame Probe

find . -name "*.htm" | xargs rename.sh ".htm" ".html" 
Verwandte Themen