Comando CMD para criar pasta para cada arquivo e mover o arquivo para a pasta

10

Eu preciso de um comando que possa ser executado na linha de comando para criar uma pasta para cada arquivo (com base no nome do arquivo) em um diretório e depois mover o arquivo para as pastas recém-criadas.

Exemplo:

Pasta inicial:

Dog.jpg
Cat.jpg

O comando a seguir funciona muito bem na criação de uma pasta para cada nome de arquivo no diretório de trabalho atual.

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

Pasta de resultado:

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

Preciso dar um passo adiante e mover o arquivo para a pasta

O que eu quero alcançar é:

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

Alguém pode me ajudar com um comando para fazer tudo isso?

Tom
fonte

Respostas:

10

O segundo comando seria

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

EDIT: Adicionado "" para o% i, com base no comentário de and31415. TNX.

LPChip
fonte
4
Depois disso, eu diria que A) poderia combiná-los - for %i in (*) do cmda && cmdb B) poderia ecoar primeiro for %i in (*) do @ECHO cmda && cmdb C) poderia adicionar Eu acho que é um / R para passar por subdiretórios.
barlop 31/05
2
Este comando não funcionará quando os nomes dos arquivos contiverem espaços. Você deve usar algo como isto: for %i in (*) do move "%~i" "%~ni"Mesmo isso pode não ser bom o suficiente, pois pode ter efeitos colaterais quando a pasta de destino não existe (por exemplo, arquivos sendo "movidos" sobre si mesmos e, portanto, renomeados). Uma solução fácil seria combinar os dois comandos, assim: for %i in (*) do md "%~ni" && move "%~i" "%~ni"O comando supõe que os diretórios ainda não existam.
and31415
2
Além disso, para expandir o comentário do barlop, quando você o usar cmda && cmdb, cmdbserá executado apenas se tiver cmdasido bem-sucedido. Se você fosse usar cmda & cmdb, o segundo comando seria executado independentemente. De fato, um único e comercial ( &) é apenas um separador de comandos e o duplo e comercial ( &&) é condicional . Comandos que não definem um errorlevelvalor não devem ser usados ​​com o último.
and31415
5

Basta executar estes comandos em série:

Para criar as pastas para cada arquivo:

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

Para mover cada arquivo para sua pasta:

for %i in (*) do move "%i" "%~ni"
Yusuph wickama
fonte
11
Bem-vindo ao Super Usuário! Isso duplica outra resposta e não adiciona novo conteúdo. Não poste uma resposta, a menos que você realmente tenha algo novo para contribuir.
DavidPostill
-1

Isso será feito se você tiver algumas pastas como: exemplo years \ Filename.mp4

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

listará todos os arquivos da pasta no 1º nível; lista todos * .mp4 e * .mkv criará as pastas de 2 níveis com o nome do arquivo e moverá todos os mesmos arquivos de nome na pasta de 1º nível para a pasta de 2º nível, execute-a na pasta base dos anos.

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

Se você não tiver uma pasta YEARS de 1º nível, basta ignorar a primeira e executar a 2ª etapa, execute-a na pasta base do nome do arquivo.

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

O && garantirá que o mkdir% ERRORLEVEL% anterior seja 0 para executar a movimentação dos arquivos

Para testar, use o seguinte:

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do echo "%~dpi%~ni" && echo "%~dpi%~ni.*" "%~dpi%~ni\"
Olívio Moura
fonte
Localizar arquivos deixados: for / d% D em (*) fazer por% i in (% ~ fD \ *) fazer echo "% ~ dpi% ~ fi"
Olívio Moura
para / d% D em (*) para fazer% i na (% ~ fD \ *) fazer mover "% ~ fi" "D: \ LIXO \"
Olívio Moura