Câu hỏi Cách đổi tên nhiều thư mục trong khi vẫn giữ các thư mục con của chúng


Tôi muốn đổi tên nhiều thư mục và giữ nguyên tất cả các tệp và thư mục con.
Các lệnh trong Windows giống như xcopy và move không thể xử lý mọi trường hợp*.

Tôi thiết lập hai cột với đường dẫn cũ và đường dẫn mới.

OLD PATH            NEW PATH
C:\dir1\dir3\dir7   C:\a1\a2\a3      
C:\dir1\dir4\dir8   C:\b1\b2\b3      
C:\dir2\dir5\dir9   C:\c1\c2\c3      
...
C:\dir2\dir6\dir0   C:\d1\d2\d3      

Khó khăn: Nhiều hơn một thư mục trên mỗi dòng cần phải được đổi tên; các thư mục được liệt kê cuối cùng như dir7 có thể có nhiều thư mục con; tập tin tem thời gian không nên sửa đổi


* xcopy không thể di chuyển, nó chỉ sao chép. Đó là một vấn đề nếu bạn không có đủ không gian để sao chép và xóa dữ liệu lớn.
Các move lệnh không di chuyển các thư mục con, chỉ các tệp


0
2017-11-20 20:55


gốc


Đây có phải là một câu hỏi thực sự? Bạn có nghĩ ra câu trả lời của riêng bạn trong vòng một phút không? Hay đó là "howto" cá nhân của bạn? - Rik
superuser.com/help/self-answer - nixda
Đuợc. Lỗi của tôi. Không biết điều đó. - Rik


Các câu trả lời:


Phiên bản batchfile đơn giản (đơn giản) sẽ giống như sau:

call :robo "C:\dir1\dir3\dir7"   "C:\a1\a2\a3"
call :robo "C:\dir1\dir4\dir8"   "C:\b1\b2\b3"
call :robo "C:\dir2\dir5\dir9"   "C:\c1\c2\c3"
echo etc...
call :robo "C:\dir2\dir6\dir0"   "C:\d1\d2\d3"
goto:eof

:robo
robocopy %1 %2 /MOVE /E
goto:eof

Bạn sẽ cần trích dẫn các thư mục trong trường hợp chúng có dấu cách.

Để đọc các thư mục trong một tệp, bạn sẽ thực hiện việc này:

directories.txt:

C:\dir1\dir3\dir7,C:\a1\a2\a3
C:\dir1\dir4\dir8,C:\b1\b2\b3
C:\dir2\dir5\dir9,C:\c1\c2\c3
C:\dir2\dir6\dir0,C:\d1\d2\d3

Không cần báo giá và tách chúng bằng dấu phẩy. Sau đó, trong batchfile:

FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  robocopy "%%A" "%%B" /MOVE /E
)

Ngoài ra ở đây ... nếu bạn muốn xem những gì robocopy đầu tiên sử dụng /L.

Nếu bạn có một tệp như thế này (với dấu cách để căn chỉnh cột đầu tiên và cột thứ hai), bạn sẽ cần phải thêm một số mã để tách không gian đầu và cuối khỏi các thư mục:

Một lần nữa directories.txt:

C:\dir1\dir3\dir7\sada\asda ,  C:\a1\a2\a3
C:\dir1\dir4\dir8           ,  C:\b1\b2\b3
C:\dir2\dir5\dir9           ,  C:\c1\c2\c3
...
C:\dir2\dir6\dir0           , C:\d1\d2\d3

Và đây là batchfile:

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  call :trim dir1 %%A
  call :trim dir2 %%B
  robocopy "!dir1!" "!dir2!" /MOVE /E
)
goto:eof

:trim
set trimmed=%2
for /f "tokens=* delims= " %%c in ("%trimmed%") do set trimmed=%%c
for /l %%c in (1,1,100) do if "!trimmed:~-1!"==" " set trimmed=!trimmed:~0,-1!
set "%~1=%trimmed%"
goto:eof

Lưu ý: Không kiểm tra lỗi được thực hiện để xem các thư mục có thực sự tồn tại hay chỉ có một cột được điền ... v.v ...
(nhưng tất nhiên có thể được thêm vào).


1
2017-11-21 00:05



Tôi thích cách tiếp cận thứ hai, tôi sẽ thử - nixda