Przenieś wszystkie pliki w podfolderach do folderu nadrzędnego

0

Po pierwsze, zdaję sobie sprawę z tego, że jest mnóstwo podobnych pytań i wiem, że musiałem próbować przystosować co najmniej 5 z nich, ale wciąż tu pytam, ponieważ mam brzydkie pojęcie o CMD (które, jak sądziłem, było dobre aż do tego momentu) frustruje mnie ogólnymi, niepomyślnymi błędami i nie mogę zrozumieć, jaka część składni jest błędna. Jest to prawdopodobnie spowodowane faktem, że inne pytania dotyczą struktur folderów / nazw plików ich odpowiednich OP, a kiedy próbuję dostosować kod do mojej własnej struktury folderów / plików, odmawia on pracy. Dlatego pytam o CMD for rozwiązanie pętli, które będzie działało dla mojej własnej struktury plików i folderów.

Mam folder nadrzędny, który zawiera wiele innych folderów, w których znajdują się pliki:

Parent Folder
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2

...i tak dalej.

Chcę użyć CMD for pętla w połączeniu z move polecenie wyodrębnienia wszystkich plików z podfolderów do folderu nadrzędnego, pozostawiając każdy podfolder pusty.

Podając CMD for pętla proszę rozbić to, co robi każda część polecenia, ponieważ pomoże to upewnić się, że rozumiem kod i mam nadzieję, że zminimalizuję problemy, które sprawiają, że kod działa dla mnie.

Hashim
źródło
co by było, gdybyś to zrobił dir /s/b >a.a aby uzyskać listę wszystkich plików, po jednym w wierszu. Wtedy ty move na początku każdej linii i c:\blah\myparentfolder na końcu każdej linii masz listę poleceń i możesz nazwać plik blah.bat i uruchomić go
barlop

Odpowiedzi:

2

W porządku, w końcu to zrozumiałem, dostosowując kod z jeszcze jednego pytania. Dzięki @AFH za wyjaśnienie części, których nie byłem pewien w komentarzach do tej odpowiedzi, i za jego ogólną pomoc z tym - jest to bardzo doceniane.

Aby wyodrębnić wszystkie pliki z podfolderów do ich folderu nadrzędnego

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER"

Pamiętaj, aby zastąpić wszystkie wystąpienia PARENTFOLDER ze ścieżką do folderu, do którego chcesz wyodrębnić pliki.

Aby wyodrębnić wszystkie pliki z podfolderów i Usuń puste podfoldery

Jest mało prawdopodobne, że będziesz musiał pozostawić puste podfoldery po wyodrębnieniu z nich plików - na pewno nie - więc poniższe polecenie automatyzuje ich usuwanie.

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER" && cd "PARENTFOLDER" && for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

Ponownie zastąp wszystkie wystąpienia PARENTFOLDER ze ścieżką do folderu, do którego chcesz wyodrębnić pliki.

W tym momencie jednak nie jest to już jeden liner i zaczyna się nieco kręcić po wklejeniu do wiersza poleceń, więc łatwiej jest po prostu umieścić całość w pliku wsadowym. Używanie zmiennych do ścieżki do folderu nadrzędnego pozwala zastąpić tylko jedną instancję PARENTFOLDER na początku pliku i jest to również bezpieczniejsza opcja, zapobiegająca przypadkowemu usunięciu pustych folderów, które warto zachować.

Plik wsadowy

Wklej do pliku tekstowego, zastąp PARENTFOLDER ze ścieżką do folderu, z którym chcesz pracować, i zapisz go za pomocą .bat rozbudowa. Uruchom w dowolnym katalogu.

@ECHO OFF
SETLOCAL
SET parent="PARENTFOLDER"
CD /d %parent% 
FOR /r %parent% %%d IN (*.*) DO MOVE "%%d" %parent% 
FOR /f "delims=" %%d IN ('DIR /a:d /s /b ^| SORT /r') DO RD "%%d"
ECHO Done. Press any key to terminate script.
PAUSE >NUL
Hashim
źródło
1
The for składnia komendy nie jest racjonalna, ale pierwsza %d definiuje d jako zmienna pętli i druga %d jest tym, do czego zmienna pętli rozszerza się przy każdym przejściu pętli (składnia Uniksa jest bardziej racjonalna: for ... d in ... do ... ). Pierwsza instancja nie jest rozwijana, więc nie wymaga cytowania, inaczej niż po do, gdzie %d może rozwinąć się do nazw plików z osadzonymi spacjami. Nie ma w tym nic specjalnego d: można użyć dowolnej pojedynczej litery, ale d jest logiczny dla katalogów (lub f dla plików). Jeszcze bardziej irracjonalnie %%d musi być używany w partii ( .cmd lub .bat ) plik.
AFH
1
Bez testowania myślę, że chcesz zagnieżdżenia for, wzdłuż linii for /d %d in (PARENTFOLDER\*) do for /r "%d" %f in (*.*) do move "%f" TARGETLOCATION. Jeśli uwzględnisz dodatkowe wymagania w swoim pytaniu, prześlę odpowiedź na korzyść innych.
AFH
1
Jeśli PARENTFOLDER zawiera spacje, należy je zacytować. Proponuję, żebyś to zrobił echo między pierwszym do i drugi for, aby dokładnie sprawdzić, co zagnieżdżono for komenda zostanie wykonana. Twoje warunki mają tak wiele możliwych wariantów, że nie mogę tutaj ustawić reprezentatywnego testu.
AFH
1
Jeśli nie cytujesz PARENTFOLDER i to jest coś takiego name with spaces, pierwszy for oceni jako for /d %d in (name with spaces\*) do ..., więc d stanie się sukcesywnie name, with, a następnie wszelkie pliki pasujące do maski spaces\*. Nawiasy nie kończą wymogu cytowania. Nie musisz cytować tylko raz cd polecenie, które przyjmuje resztę linii jako pojedynczy parametr, w tym wszelkie spacje (choć Tab rozszerzenia wstawia cytaty); md i rd może działać w wielu katalogach, więc trzeba cytować, jeśli nazwy mają spacje.
AFH
1
Cieszę się, że to rozwiązałeś.
AFH