Polecenie CMD, aby utworzyć folder dla każdego pliku i przenieść plik do folderu

10

Potrzebuję polecenia, które można uruchomić z wiersza polecenia, aby utworzyć folder dla każdego pliku (na podstawie nazwy pliku) w katalogu, a następnie przenieść plik do nowo utworzonych folderów.

Przykład:

Folder początkowy:

Dog.jpg
Cat.jpg

Poniższe polecenie działa świetnie podczas tworzenia folderu dla każdej nazwy pliku w bieżącym katalogu roboczym.

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

Folder wyników:

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

Muszę pójść o krok dalej i przenieść plik do folderu.

Chcę osiągnąć:

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

Czy ktoś może mi pomóc jednym poleceniem, aby to wszystko zrobić?

Tomek
źródło

Odpowiedzi:

10

Drugie polecenie byłoby

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

EDYCJA: Dodano „” dla% i, na podstawie komentarza and31415. tnx.

LPChip
źródło
4
W związku z tym powiedziałbym, że A) może je połączyć - for %i in (*) do cmda && cmdb B) może powtórzyć najpierw for %i in (*) do @ECHO cmda && cmdb C) może dodać Myślę, że przejście przez podkatalogi to / R.
barlop
2
To polecenie nie działa, gdy nazwy plików zawierają spacje. Powinieneś użyć czegoś takiego: for %i in (*) do move "%~i" "%~ni"Nawet to może nie być wystarczająco dobre, ponieważ może mieć skutki uboczne, gdy folder docelowy nie istnieje (np. Pliki są „przenoszone” nad sobą, stąd ich nazwa). Łatwym rozwiązaniem byłoby połączenie obu poleceń w następujący sposób: for %i in (*) do md "%~ni" && move "%~i" "%~ni"Polecenie zakłada, że ​​katalogi jeszcze nie istnieją.
i31415
2
Ponadto, aby poszerzyć komentarz barlop użytkownika podczas korzystania cmda && cmdbnastępnie cmdbzostanie wykonany tylko wtedy, gdy cmdabył udany. Jeśli miałbyś użyć cmda & cmdbzamiast tego, drugie polecenie zostanie wykonane niezależnie. W rzeczywistości pojedynczy znak ampersand ( &) jest tylko separatorem poleceń, a znak podwójny ampersand ( &&) jest warunkowy . Komendy, które nie ustawiają errorlevelwartości, nie powinny być używane z tym ostatnim.
i31415
5

Wystarczy wykonać te polecenia szeregowo:

Aby utworzyć foldery dla każdego pliku:

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

Aby przenieść każdy plik do jego folderu:

for %i in (*) do move "%i" "%~ni"
Yusuph Wickama
źródło
1
Witamy w Super User! To powiela inną odpowiedź i nie dodaje żadnej nowej treści. Nie publikuj odpowiedzi, chyba że masz coś nowego do dodania.
DavidPostill
-1

To zrobi, jeśli masz jakieś foldery, takie jak: przykład lata \ Nazwa pliku.mp4

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

wyświetli listę wszystkich plików 1. poziomu folderu; wyświetla listę wszystkich * .mp4 i * .mkv utworzy foldery 2-poziomowe z nazwą pliku i przeniesie wszystkie te same pliki nazw w folderze 1-go poziomu do folderu 2-go poziomu, uruchom go w folderze podstawowym lata.

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

Jeśli nie masz folderu YEARS pierwszego poziomu, możesz po prostu ominąć pierwszy i uruchomić drugi krok, uruchom go w folderze podstawowym nazwy pliku.

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

&& zapewni, że poprzednie mkdir% ERRORLEVEL% wynosi 0, aby uruchomić przenoszenie plików

Aby przetestować, użyj tego:

for /d %D in (*) do for %i in (%~fD\*.mp4,%~fD\*.mkv) do echo "%~dpi%~ni" && echo "%~dpi%~ni.*" "%~dpi%~ni\"
Olívio Moura
źródło
Znajdź pozostawione pliki: dla / d% D w (*) wykonaj dla% i w (% ~ fD \ *) wykonaj echo "% ~ dpi% ~ fi"
Olívio Moura
dla / d% D w (*) wykonaj dla% i w (% ~ fD \ *) przenieś "% ~ fi" "D: \ TRASH \"
Olívio Moura