Lệnh CMD để tạo thư mục cho mỗi tệp và di chuyển tệp vào thư mục


10

Tôi cần một lệnh có thể được chạy từ dòng lệnh để tạo một thư mục cho mỗi tệp (dựa trên tên tệp) trong một thư mục và sau đó di chuyển tệp vào các thư mục mới được tạo.

Thí dụ :

Thư mục bắt đầu:

Dog.jpg
Cat.jpg

Lệnh sau hoạt động rất tốt trong việc tạo thư mục cho mỗi tên tệp trong thư mục làm việc hiện tại.

for %i in (*) do md "%~ni"

Thư mục kết quả:

\Dog\
\Cat\
Dog.jpg
Cat.jpg

Tôi cần phải thực hiện thêm một bước này và di chuyển tệp vào thư mục.

Những gì tôi muốn đạt được là:

\Dog\Dog.jpg
\Cat\Cat.jpg

Ai đó có thể giúp tôi với một lệnh để làm tất cả điều này?

Câu trả lời:


10

Lệnh thứ hai sẽ là

for %i in (*) do move "%i" "%~ni"

EDIT: Đã thêm "" cho% i, dựa trên nhận xét của and31415. tnx.


4
Tiếp theo đó tôi sẽ nói A) có thể kết hợp chúng- for %i in (*) do cmda && cmdb B) có thể lặp lại đầu tiên for %i in (*) do @ECHO cmda && cmdb C) có thể thêm Tôi nghĩ rằng đó là / R để đi qua các thư mục con.
barlop

2
Lệnh này sẽ không hoạt động khi tên tệp chứa khoảng trắng. Bạn nên sử dụng một cái gì đó như thế này: for %i in (*) do move "%~i" "%~ni"Ngay cả điều đó có thể không đủ tốt, vì nó có thể có tác dụng phụ khi thư mục đích không tồn tại (ví dụ: các tệp được "di chuyển" qua chính chúng, do đó được đổi tên). Một giải pháp dễ dàng là kết hợp cả hai lệnh, như thế này: for %i in (*) do md "%~ni" && move "%~i" "%~ni"Lệnh giả định rằng các thư mục chưa tồn tại.
và31415

2
Ngoài ra, để mở rộng nhận xét của barlop, khi bạn sử dụng cmda && cmdbthì cmdbsẽ chỉ được thực hiện nếu cmdathành công. Nếu bạn sử dụng cmda & cmdbthay thế, thì lệnh thứ hai sẽ được thực thi bất kể. Trong thực tế, một ampersand ( &) chỉ là một dấu phân cách lệnh và ampersand kép ( &&) là một điều kiện . Các lệnh không đặt errorlevelgiá trị không nên được sử dụng với lệnh sau.
và31415

5

Chỉ cần thực hiện các lệnh này trong chuỗi:

Để tạo các thư mục cho mỗi tệp:

for %i in (*) do mkdir "%~ni"

Để di chuyển từng tệp vào thư mục của nó:

for %i in (*) do move "%i" "%~ni"

1
Chào mừng bạn đến với Siêu người dùng! Điều này trùng lặp một câu trả lời khác và không thêm nội dung mới. Vui lòng không đăng câu trả lời trừ khi bạn thực sự có điều gì đó mới để đóng góp.
DavidPostill

-1

Điều này sẽ làm điều đó nếu bạn có một số thư mục như: example Years \ Filename.mp4

1901\Filename.mp4 
1902\Filename.mp4
1903\Filename.mp4

nó sẽ liệt kê tất cả các tập tin cấp 1 của thư mục; liệt kê tất cả * .mp4 và * .mkv sẽ tạo các thư mục cấp 2 với tên tệp và sẽ di chuyển tất cả các tệp cùng tên trong thư mục cấp 1 sang thư mục cấp 2, chạy ở thư mục cơ sở năm.

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do mkdir "%~dpi%~ni" && move "%~dpi%~ni.*" "%~dpi%~ni\"

Nếu bạn không có thư mục NĂM cấp 1, bạn có thể bỏ qua bước đầu tiên và chạy bước thứ 2, chạy thư mục cơ sở tên tệp.

for %i in (*.mp4,*.mkv) do mkdir "%~dpi%~ni" && move "%~dpi%~ni.*" "%~dpi%~ni\"

&& sẽ đảm bảo rằng mkdir% ERRORLEVEL% trước đó là 0 để chạy di chuyển các tệp

Để kiểm tra, sử dụng cái này:

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do echo "%~dpi%~ni" && echo "%~dpi%~ni.*" "%~dpi%~ni\"

Tìm các tệp bên trái: for / d% D in (*) làm cho% i in (% ~ fD \ *) làm echo "% ~ dpi% ~ fi"
Olívio Moura

cho / d% D trong (*) làm cho% i trong (% ~ fD \ *) di chuyển "% ~ fi" "D: \ TRASH \"
Olívio Moura
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.