Команда CMD для створення папки для кожного файлу та переміщення файлу у папку


10

Мені потрібна команда, яку можна запустити з командного рядка, щоб створити папку для кожного файлу (на основі імені файлу) у каталозі, а потім перемістити файл у новостворені папки.

Приклад:

Початкова папка:

Dog.jpg
Cat.jpg

Наступна команда чудово працює при створенні папки для кожного імені файлу в поточному робочому каталозі.

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

Папка результатів:

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

Мені потрібно зробити цей крок далі і перемістити файл у папку.

Я хочу досягти:

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

Чи може хтось допомогти мені однією командою зробити все це?

Відповіді:


10

Друга команда була б

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

EDIT: Додано "" для% i, грунтуючись на коментарі and31415 tnx.


4
Виходячи з цього, я б сказав, що А) міг би їх поєднати - for %i in (*) do cmda && cmdb Б) міг би відлуння for %i in (*) do @ECHO cmda && cmdb с) С) можу додати, я думаю, що це / R, щоб пройти через підкаталоги.
барлоп

2
Ця команда не буде працювати, якщо імена файлів містять пробіли. Ви повинні використовувати щось подібне: for %i in (*) do move "%~i" "%~ni"Навіть це може бути недостатньо гарним, оскільки це може мати побічні ефекти, коли цільова папка не існує (наприклад, файли пересуваються над собою, отже перейменовані). Простим рішенням було б поєднувати обидві команди, наприклад: for %i in (*) do md "%~ni" && move "%~i" "%~ni"Команда передбачає, що каталоги вже не існують.
і31415

2
Крім того, для розширення коментаря барлопу, коли ви користуєтеся cmda && cmdbцим cmdb, виконується лише в тому випадку, якщо це cmdaбуло успішно. Якби ви використовували cmda & cmdbзамість цього, то друга команда виконувалася б незалежно. Насправді, один амперсанд ( &) - це лише роздільник команд, а подвійний амперсанд ( &&) - умовний . Команди, які не встановлюють errorlevelзначення, не повинні використовуватися останніми.
і31415

5

Просто виконайте ці команди послідовно:

Для створення папок для кожного файлу:

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

Для переміщення кожного файлу у свою папку:

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

1
Ласкаво просимо до Супер Користувача! Це дублює іншу відповідь і не додає нового вмісту. Будь ласка, не публікуйте відповіді, якщо у вас насправді є щось нове.
DavidPostill

-1

Це буде зроблено, якщо у вас є деякі папки типу: example years \ Filename.mp4

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

в ньому буде вказано всі папки файлів 1-го рівня; перелічує всі * .mp4 та * .mkv створить дворівневі папки з назвою файлу та перемістить усі однойменні файли в папці 1-го рівня до папки другого рівня, запустить його у базовій папці років.

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

Якщо у вас немає папки YEARS першого рівня, ви можете просто обійти перший і виконати другий крок, запустити його в базовій папці імені файлу.

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

&& забезпечить попередній mkdir% ERRORLEVEL% 0 для запуску переміщення файлів

Для тестування використовуйте це:

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

Знайдіть ліві файли: for / d% D в (*) do for% i in (% ~ fD \ *) do echo "% ~ dpi% ~ fi"
Olívio Moura

для / d% D у (*) зробіть для% i в (% ~ fD \ *) перемістіться "% ~ fi" "D: \ TRASH \"
Olívio Moura
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.