Perintah CMD untuk membuat folder untuk setiap file dan memindahkan file ke folder

10

Saya memerlukan perintah yang dapat dijalankan dari baris perintah untuk membuat folder untuk setiap file (berdasarkan nama file) dalam direktori dan kemudian memindahkan file ke folder yang baru dibuat.

Contoh:

Folder mulai:

Dog.jpg
Cat.jpg

Perintah berikut bekerja sangat baik untuk membuat folder untuk setiap nama file di direktori kerja saat ini.

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

Folder Hasil:

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

Saya perlu mengambil satu langkah lebih jauh dan memindahkan file ke folder.

Yang ingin saya capai adalah:

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

Bisakah seseorang membantu saya dengan satu perintah untuk melakukan semua ini?

Tom
sumber

Jawaban:

10

Perintah kedua adalah

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

EDIT: Menambahkan "" untuk% i, berdasarkan komentar and31415. tnx.

LPChip
sumber
4
Menyusul dari itu saya akan mengatakan A) dapat menggabungkan mereka- for %i in (*) do cmda && cmdb B) bisa gema pertama for %i in (*) do @ECHO cmda && cmdb C) bisa menambahkan saya pikir itu a / R untuk pergi melalui subdirs.
barlop
2
Perintah ini tidak akan berfungsi ketika nama file berisi spasi. Anda harus menggunakan sesuatu seperti ini: for %i in (*) do move "%~i" "%~ni"Bahkan itu mungkin tidak cukup baik, karena dapat memiliki efek samping ketika folder target tidak ada (mis. File sedang "dipindahkan" dengan sendirinya, maka diganti namanya). Solusi mudah adalah dengan menggabungkan kedua perintah, seperti ini: for %i in (*) do md "%~ni" && move "%~i" "%~ni"Perintah ini mengasumsikan bahwa direktori belum ada.
and31415
2
Juga, untuk memperluas komentar barlop, ketika Anda menggunakan cmda && cmdbmaka cmdbakan dieksekusi hanya jika cmdaberhasil. Jika Anda menggunakan cmda & cmdbsebagai gantinya, maka perintah kedua akan dieksekusi terlepas. Faktanya, satu ampersand ( &) hanyalah pemisah perintah dan double ampersand ( &&) adalah yang bersyarat . Perintah yang tidak menetapkan errorlevelnilai tidak boleh digunakan dengan yang terakhir.
and31415
5

Cukup jalankan perintah ini secara seri:

Untuk membuat folder untuk setiap file:

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

Untuk memindahkan setiap file ke foldernya:

for %i in (*) do move "%i" "%~ni"
Yusuph wickama
sumber
1
Selamat Datang di Pengguna Super! Ini menggandakan jawaban lain dan tidak menambahkan konten baru. Tolong jangan memposting jawaban kecuali Anda benar-benar memiliki sesuatu yang baru untuk disumbangkan.
DavidPostill
-1

Ini akan melakukannya jika Anda memiliki beberapa folder seperti: contoh tahun \ Filename.mp4

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

itu akan mencantumkan semua folder file tingkat 1; daftar semua * .mp4 dan * .mkv akan membuat folder 2 level dengan nama file dan akan memindahkan semua file nama yang sama di folder level 1 ke folder level 2, jalankan di folder basis tahun.

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

Jika Anda tidak memiliki folder TAHUN 1 tingkat, Anda dapat mem-bypass yang pertama untuk dan menjalankan langkah ke-2, jalankan di folder basis nama file.

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

&& akan memastikan bahwa mkdir% ERRORLEVEL% sebelumnya adalah 0 untuk menjalankan perpindahan file

Untuk menguji, gunakan ini:

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do echo "%~dpi%~ni" && echo "%~dpi%~ni.*" "%~dpi%~ni\"
Olívio Moura
sumber
Temukan file kiri: untuk / d% D di (*) lakukan untuk% i di (% ~ fD \ *) lakukan echo "% ~ dpi% ~ fi"
Olívio Moura
untuk / d% D di (*) lakukan untuk% i di (% ~ fD \ *) lakukan pindah "% ~ fi" "D: \ TRASH \"
Olívio Moura