2011-01-12 11 views
1

ファイル名にアンダースコアを含むファイル名を持つWindowsサブディレクトリのファイルの名前を変更するスクリプトを提案することができます。ファイル名はWindowsサブディレクトリ内のファイルの名前を変更するスクリプト

abc xyz.pdf 

ある場合たとえば、これは、次のバッチファイル

abc_xyz.pdf 
+0

サブディレクトリのサブディレクトリに再帰する必要はありますか? – Casey

+0

ディレクトリへの再帰 – iceman

+0

サブディレクトリ名にスペースが含まれているとどうなりますか?そのまま残す?または名前を変更しますか?名前を変更した場合、PARENTディレクトリの名前を変更しないでください。例えば。 'C:\ my docs \ pdfs'で始まり、' C:\ my docs \ pdfs \ sci fi \ star wars1.pdf'ファイルを持っていれば、 'C:\ my docs \ pdfs \ sci fi \ star_wars1.pdf'、 'C:\ my docs \ pdfs \ sci_fi \ star_wars1.pdf'、または' C:\ my_docs \ pdfs \ sci_fi \ star_wars1.pdf'のいずれかです。私は#1と仮定しています。 – DVK

答えて

1

Perl:ファイルの再帰的な検索と処理にはを使用してください。

次の点に注意する必要があるので注意してください。アンダースコアのDIRECTORIESの名前を変更しないでください。したがって、File::Basename

use File::Find; 
use File::Basename; 
use File::Spec; 
use strict; 

find ({ 'wanted' => \&renamefile }, 'X:\my\sub\dir'); 

sub renamefile { 
    my $file = $_; 
    return unless (-f $file); # Don't rename directories! 
    my $dirname = dirname($file); # file's directory, so we rename only the file itself. 
    my $file_name = basename($file); # File name fore renaming. 
    my $new_file_name = $file_name; 
    $new_file_name =~ s/ /_/g; # replace all spaces with underscores 
    rename($file, File::Spec->catfile($dirname, $new_file_name)) 
     or die $!; # Error handling - what if we couldn't rename? 
} 
+1

質問のコメントに記載されているように、(1)起動ディレクトリ内のサブディレクトリにスペースがあり、(2)起動ディレクトリにスペースがある場合、どうなるべきか不明です。上記のコードでは答えは「何もない」と仮定しています。サブディレクトリーの名前を変更したいが、開始ディレクトリーの名前を変更したくない場合は、少し複雑になります。 – DVK

+0

このように私もそれが必要です。 – Hongtao

0

する必要がありますテストされていませんが、動作するはずです。

@echo off 
for %%i in (*) do call :rename "%%~ni" 
goto :EOF 

:rename 
set filename=%1 
set newname=%filename: =_% 
rename "filename" "newname" 
0

ここにはVBScriptスクリプトがあります。これは、フォルダCにファイルの名前を変更します:\テスト

 
    Dim fso, f, f1, fc, s 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set f = fso.GetFolder("C:\Test") 
    Set fc = f.Files 
    For Each f1 in fc 
     f1.move f1.ParentFolder & "\" & replace(f1.Name, " ", "_") 
    Next 
+0

'f1.move'行に構文エラーがあると思います。 – Casey

+0

構文エラーはありません。しかし、ディレクトリを通って実行されません。 VBScriptにはrenamefileメソッドがありません。移動がその方法です。 – BZ1

0

は、イムはまだPERLはので、この中で刺しを取った...

opendir (curDir, "."); 

@filesWithSpaces = grep(/.*\s.*\..*/, readdir (curDir)); 

foreach $oneFile (@filesWithSpaces){ 
    $newName = $oneFile; 
    $newName =~ s/\ /_/g; 
    print "RENAMING: $oneFile -> $newName \n"; 
    rename($oneFile, $newName); 

}

を学ぶことは、私の最初のテストで正常に見えます。しかし、再帰的ではありません。

+0

これには、DIRECTORY名のスペースの名前を変更するなど、いくつかのエラーがあります。 – DVK

0

ここには動作するVBScriptがあります。しかし、指定されたディレクトリのサブディレクトリには再帰しません。

Dim fso 
Dim folder 
Dim stringToFind 
Dim replacement 

' Check arguments 
If Wscript.Arguments.Count <> 3 Then 
    ' Usage 
    Wscript.echo "Usage: rename.vbs folder string_to_find replacement" 
    WScript.Quit 
End If 

Set fso = CreateObject("Scripting.FileSystemObject") 

Set folder = fso.GetFolder(WScript.Arguments(0)) 

If Err.Number <> 0 Then 
    WScript.Echo "Folder " & WScript.Arguments(0) & " does not exist." 
    WScript.Quit 
End If 

stringToFind = WScript.Arguments(1) 
replacement = WScript.Arguments(2) 

For Each file in folder.Files 
    fso.MoveFile file.ParentFolder & "\" & file.Name, file.ParentFolder & "\" & Replace(file.Name, stringToFind, replacement) 
Next 

Set folder = Nothing 
Set fso = Nothing 
関連する問題