Jakie polecenie w systemie Windows emuluje rekursywne polecenie przenoszenia / zmiany nazwy z systemu Unix?
Jakie polecenie w systemie Windows emuluje rekursywne polecenie przenoszenia / zmiany nazwy z systemu Unix?
Odpowiedzi:
Użyj for
polecenia XP . Na przykład z wiersza poleceń ( %%x
zamiast tego użyj pliku wsadowego ), aby wykonać ruch rekurencyjny:
for /r %x in (foo) do move "%x" "drive:\path\bar"
Aby wykonać rekurencyjną zmianę nazwy:
for /r %x in (*.c) do ren "%x" *.cpp
Przykładowa partia:
for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
*.*
działać?
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).
Właśnie uruchomiłem mały przykład w moim pudełku Windows XP SP2 z poleceniem move i zadziałało. Wszystkie pliki i katalogi zostały przeniesione ze źródła do miejsca docelowego. source i dest to nazwy katalogów.
przenieś źródło dest
ver Microsoft Windows XP [wersja 5.1.2600]
ruszaj się /? Przenosi pliki i zmienia nazwy plików i katalogów. Aby przenieść jeden lub więcej plików: MOVE [/ Y | / -Y] [dysk:] [ścieżka] nazwa_pliku1 [, ...] miejsce docelowe Aby zmienić nazwę katalogu: MOVE [/ Y | / -Y] [dysk:] [ścieżka] nazwa_katalogu1 nazwa_katalogu2 [dysk:] [ścieżka] nazwa_pliku1 Określa lokalizację i nazwę pliku lub pliki, które chcesz przenieść. miejsce docelowe Określa nową lokalizację pliku. przeznaczenie może składać się z litery dysku i dwukropka, a nazwa katalogu lub kombinacja. Jeśli się przeprowadzasz tylko jeden plik, możesz także podać nazwę pliku, jeśli chcesz zmienić nazwę pliku podczas jego przenoszenia. [dysk:] [ścieżka] nazwa_katalogu1 Określa katalog, którego nazwę chcesz zmienić. dirname2 Określa nową nazwę katalogu. / Y Pomija monit o potwierdzenie, że chcesz zastąp istniejący plik docelowy. / -Y Powoduje monitowanie o potwierdzenie zamiaru zastąpienia istniejący plik docelowy. Przełącznik / Y może być obecny w zmiennej środowiskowej COPYCMD. Można to zastąpić opcją / -Y w wierszu polecenia. Domyślnie jest wyświetlać monit o zastąpienie, chyba że wykonywane jest polecenie MOVE w skrypcie wsadowym.
Wbudowane polecenie XCOPY jest zamknięte. Zrobi kopię rekurencyjną, ale nie sądzę, że obsługuje zmianę nazwy.
for /r %%x in (%1) do ren "%%x" %2
zmieni to rekurencyjnie nazwę pliku :-)
zapisz w pliku podaj 2 argumenty od rozszerzenia i do rozszerzenia.
np. nazwa pliku to komenda test.bat: test * .avi * .bmp
zmienia nazwy wszystkich plików z rozszerzeniem avi na bmp (we wszystkich podfolderach :))
Uwaga: To jest korekta dla postu, który odpowiedział 26 października o 13:20 przez Roba Kam. Dał za
/r %x in (*.c) do ren "%x" *.cpp
gdzie jak to powinno mieć %% zamiast %
To działało dla mnie lepiej:
FOR /R "C:\folder1\folder2\" %i in (.,*) DO MOVE /Y "%i" "C:\folder1\"
Źródło: http://www.islamadel.com/index.php/notes/6-computer/10-windows-command-line
Istnieją porty Windows dla większości poleceń UNIX:
Stworzyłem skrypt VB, który będzie wyszukiwał i zamieniał nazwy katalogów ... Mam też wersję plików, jednak myślę, że to wystarczy, aby zacząć od własnego skryptu. Używam tego skryptu, mam fileandreplacedirs.vbs
i umieszczam go w tym samym folderze, co foldery, których nazwę chcę zmienić. Ponadto niekoniecznie musi się ponownie pojawiać w folderze, ale może zostać zmodyfikowany
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
Użyj prostej komendy DOS.
cd do katalogu źródłowego, w którym chcesz rekursywnie zmieniać nazwy rozszerzeń plików.
Wpisz to polecenie:
ren *.[CurrentFileExtension] *.[DesiredFileExtension]
Dodałem, if exist
aby uniknąć powrotu błędów (ma to znaczenie w Jenkins, więc nie psuje kompilacji), gdy plik nie istnieje w każdym folderze:
for /r %x in (foo) do if exist "%x" move "%x" "drive:\path\bar"
Aby wykonać rekurencyjną zmianę nazwy:
for /r %x in (*.c) do if exist "%x" ren "%x" *.cpp
Przykładowa partia:
for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp
PowerShell jest twoim przyjacielem. Nie potrzeba plików wsadowych ani skryptów. Na przykład, aby rekurencyjnie zmienić nazwę wszystkich plików .tiff na .tif w zdalnym katalogu, możesz uruchomić następującą komendę z Powershell:
get-childitem "\\\servername\d$\path" -recurse -Include *.tiff | Rename-Item -NewName {
$_.Name.replace(".tiff",".tif") }
Znalazłem ten skrypt Pythona, który również działa:
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)
Znalezione na: http://gomputor.wordpress.com/2008/09/29/change-the-extension-of-multiple-files-in-a-chosen-directory-with-python/
Dodałem Python do mojej ścieżki i umieściłem powyższy skrypt Pythona w folderze „utils”. Następnie utworzyłem ten prosty skrypt wsadowy, aby go uruchomić: rn.bat:
python \utils\rn.py %1 %2 %3
Zaktualizowałem również powyższy skrypt Pythona, aby pobierał argumenty z wiersza poleceń. 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)
Wreszcie wszystko, co musisz teraz zrobić, to coś takiego:
>rn . .foo .bar
lub
>rn \ .exe .txt
Baw się dobrze z drugim :)