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"

РЕДАКТИРОВАТЬ: Добавлено "" для% i, на основе комментария и 31415. Тпй.

LPChip
источник
4
Исходя из этого, я бы сказал, что A) мог бы объединить их - for %i in (*) do cmda && cmdb B) мог бы повторить первый for %i in (*) do @ECHO cmda && cmdb C) мог бы добавить, я думаю, что это / R, чтобы пройти через подкаталоги.
Барлоп
2
Эта команда не будет работать, если имена файлов содержат пробелы. Вы должны использовать что-то вроде этого: for %i in (*) do move "%~i" "%~ni"даже это может быть недостаточно хорошо, так как это может иметь побочные эффекты, когда целевая папка не существует (например, файлы «перемещаются» над собой, следовательно, переименовываются). Простым решением было бы объединить обе команды, например так: for %i in (*) do md "%~ni" && move "%~i" "%~ni"команда предполагает, что каталоги еще не существуют.
and31415
2
Кроме того , чтобы расширить комментарий barlop, в при использовании , cmda && cmdbто cmdbбудет выполняться только тогда , когда cmdaбыл успешным. Если бы вы использовали cmda & cmdbвместо этого, то вторая команда будет выполнена независимо. Фактически, один амперсанд ( &) - это просто разделитель команд, а двойной амперсанд ( &&) - условный . Команды, которые не устанавливают errorlevelзначение, не должны использоваться с последним.
and31415
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, создает папки 2-го уровня с именем файла и перемещает все файлы с одинаковыми именами в папке 1-го уровня в папку 2-го уровня, запускает его в базовой папке лет.

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

Если у вас нет папки ГОДА 1-го уровня, вы можете просто пропустить первую и запустить второй шаг, запустив ее в базовой папке имени файла.

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\"
Оливио Моура
источник
Найти левые файлы: для / d% D в (*) сделать для% i в (% ~ fD \ *) сделать эхо "% ~ dpi% ~ fi"
Оливио Мора
для / d% D в (*) сделать для% i в (% ~ fD \ *) сделать перемещение "% ~ fi" "D: \ TRASH \"
Оливио Мора