Windowsのどのコマンドが、Unixからの再帰的な移動/名前変更コマンドをエミュレートしますか?
XPのfor
コマンドを使用します。たとえば、コマンドラインから(バッチファイルでは%%x
代わりに)再帰的な移動を行うには、次のようにします。
for /r %x in (foo) do move "%x" "drive:\path\bar"
再帰的な名前変更を行うには、次のようにします。
for /r %x in (*.c) do ren "%x" *.cpp
バッチの例:
for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
robocopy "C:\Source Folder" "C:\Destination Folder" /E /COPYALL /XJ
Description of parameters:
/E - copy subdirectories, including Empty ones (/S to exclude empty ones)
/COPYALL - COPY ALL file info (equivalent to /COPY:DATSOU)
/XJ - eXclude Junction points and symbolic links. (normally included by default).
Windowsで小さな例を実行しただけですXP SP2ボックスでmoveコマンドを実行すると動作しました。すべてのファイルとディレクトリがソースから宛先に移動されました。ソースと宛先はディレクトリ名です。
ソースの移動先を移動
ver Microsoft Windows XP [Version 5.1.2600]
move /? ファイルを移動し、ファイルとディレクトリの名前を変更します。 1つ以上のファイルを移動するには: MOVE [/Y |/-Y] [ドライブ:] [パス]ファイル名1 [、...]宛先 ディレクトリの名前を変更するには: MOVE [/ Y |/-Y] [ドライブ:] [パス]ディレクトリ名1ディレクトリ名2 [ドライブ:] [パス]ファイル名1移動するファイル の場所と名前を指定します。 destinationファイルの新しい場所を指定します。宛先 は、ドライブ文字とコロン、 ディレクトリ名、またはその組み合わせで構成できます。 ファイルを1つだけ移動する場合、 ファイルを移動するときにファイル名を変更する場合は、ファイル名を含めることもできます。 [drive:] [path] dirname1指定名前を変更するディレクトリ。 dirname2ディレクトリの新しい名前を指定します。 /Y既存の宛先ファイルを上書きするかどうかを確認するプロンプトを表示しません 。 /-Y既存の宛先ファイルを上書きするかどうかの確認を求めます 。 スイッチ/ YがCOPYCMD環境変数に存在している可能性があります。 これは、コマンドラインの/ -Yで上書きされる場合があります。デフォルトは で、 からバッチスクリプト内でMOVEコマンドが実行されていない限り、上書きを確認します。
組み込みのXCOPYコマンドは終了しています。再帰的なコピーを行いますが、名前の変更をサポートしているとは思いません。
VBスクリプトを作成して、ディレクトリ名を検索して置き換えるスクリプトを作成しました...ファイルバージョンもありますが、これで十分です。スクリプト。このスクリプトを使用する方法は、fileandreplacedirs.vbs
、名前を変更するフォルダと同じフォルダに配置します。また、必ずしもフォルダに再帰する必要はありませんが、少し変更するだけで
search1 = InputBox("Search for...", "", "")
replace1 = InputBox("replace with...", "", "")
Dim MyFile
MyFiles = GetFileArray(".")
For Each MyFile In MyFiles
NewFilename = Replace(MyFile.Name, search1, replace1)
If InStr( MyFile.Name, search1 ) Then MyFile.Name = NewFilename
Next
MsgBox "Done..."
function GetFileArray(ByVal vPath)
'Get our objects...
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.Getfolder(vPath)
Set Files = Folder.SubFolders
'Resize the local array
'Arrays are 0 based but Files collection is 1 based.
if Files.count = 0 then
GetFileArray = array()
Exit Function
Else
Index = 0
Redim FileList(Files.Count-1)
For Each File In Files
set FileList(Index) = File
Index = Index + 1
Next
GetFileArray = FileList
End If
'Always good practice to explicitly release objects...
Set FSO = Nothing
Set Folder = Nothing
Set Files = Nothing
End function
for /r %%x in (%1) do ren "%%x" %2
これはファイルの名前を再帰的に変更します:-)
ファイルに保存すると、拡張子から拡張子までの2つの引数が与えられます。
例:ファイル名はtest.batコマンドです:test * .avi * .bmp
拡張子がaviのすべてのファイルの名前をbmpに変更します(すべてのサブフォルダーで:))。
注:これは、ロブカムが10月26日13:20に回答した投稿に対する修正です。彼はのために与えた
/r %x in (*.c) do ren "%x" *.cpp
ここで%の代わりに%%を使用します
ほとんどのUNIXコマンドにはWindowsポートがあります。
私はこれを見つけましたpython同様に機能するスクリプト:
for root, dirs, files in os.walk(cur_dir):
for filename in files:
file_ext = os.path.splitext(filename)[1]
if old_ext == file_ext:
oldname = os.path.join(root, filename)
newname = oldname.replace(old_ext, new_ext)
os.rename(oldname, newname)
Pythonをパスに追加し、上記のPythonスクリプトを「utils」フォルダに配置しました。次に、それを実行するためのこの単純なバッチスクリプトを作成しました:rn。コウモリ:
python \utils\rn.py %1 %2 %3
また、上記のpythonスクリプトを更新して、コマンドラインから引数を取得します。rn.py:
import sys
import os
cur_dir = sys.argv[1]
old_ext = sys.argv[2]
new_ext = sys.argv[3]
#print cur_dir, old_ext, new_ext
for root, dirs, files in os.walk(cur_dir):
for filename in files:
file_ext = os.path.splitext(filename)[1]
if old_ext == file_ext:
oldname = os.path.join(root, filename)
newname = oldname.replace(old_ext, new_ext)
os.rename(oldname, newname)
最後に、今必要なのは次のようなものです。
>rn . .foo .bar
または
>rn \ .exe .txt
2番目のものを楽しんでください:)
簡単なDOSコマンドを使用します。
ファイル拡張子の名前を再帰的に変更するソースディレクトリにcdします。
次のコマンドを入力します。
ren *.[CurrentFileExtension] *.[DesiredFileExtension]
Powershellはあなたの友達です。バッチファイルやスクリプトは必要ありません。たとえば、リモートディレクトリですべての.tiffファイルの名前を.tifに再帰的に変更するには、Powershellから次のコマンドを実行します。
get-childitem "\\\servername\d$\path" -recurse -Include *.tiff | Rename-Item -NewName { $_.Name.replace(".tiff",".tif") }
追加した if exist
ファイルがすべてのフォルダーに存在しない場合にエラーが返されないようにする(Jenkinsでは重要なので、ビルドが中断されません)。
for /r %x in (foo) do if exist "%x" move "%x" "drive:\path\bar"
再帰的な名前変更を行うには、次のようにします。
for /r %x in (*.c) do if exist "%x" ren "%x" *.cpp
バッチの例:
for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp