Spłaszcz strukturę katalogów


15

Mam kilka folderów w folderach. Lubię to

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

Chcę zwinąć wszystkie foldery, aby wszystkie pliki w folderze 1, folderze 2, folderze 3, ... folderze n istniały w folderze głównym.

Jaki jest najszybszy sposób na zrobienie tego w systemie Windows?


5
To zależy, jak chcesz obsługiwać zduplikowane nazwy plików?
Mark Allen

Odpowiedzi:


19

Nie ma powodu, aby używać specjalnych narzędzi, a nawet skryptów. Wystarczy użyć funkcji wyszukiwania w Eksploratorze.

  1. Otwórz folder, który chcesz spłaszczyć w Eksploratorze.
  2. Utwórz nowy folder, zaznacz wszystkie pliki (ale nie foldery) i przeciągnij je do tego folderu (pozwoli to uniknąć uzyskania dwóch kopii tych plików).
  3. W polu wyszukiwania (tym po prawej stronie paska adresu) wpisz *i naciśnij Enter.
  4. Po zapełnieniu listy kliknij prawym przyciskiem myszy i wybierz wszystko, a następnie kliknij prawym przyciskiem myszy i Wytnij.
  5. Naciśnij przycisk Wstecz, aby wrócić do oryginalnego folderu, a następnie kliknij prawym przyciskiem myszy i wklej.
  6. Jeśli masz jakieś zduplikowane nazwy, zostaniesz zapytany, jak sobie z tym poradzić. Wybierz najbardziej odpowiednią opcję dla swojego przypadku użycia. (Zakładam, że byłoby skopiowanie obu plików.) Aby uniknąć ponownego monitowania, zastosuj to do wszystkich plików z polem wyboru na dole.
  7. Wybierz wszystkie foldery, upewnij się, że są puste, wyświetlając wyskakujące okienko dotyczące liczby wybranych plików, a następnie je usuń.

Jeśli wolisz mieć skrypt, aby po prostu go uruchomić i zapomnieć, możesz to zrobić. Polecenie zamiany mv *\* .jest dość łatwe ( for /r %f in (*.*) do @move "%~f" .), ale jestem pewien, że chcesz obsługiwać duplikaty, nie pozostawiając ich w tyle, jak w odpowiedzi @Nicole Hamilton. Dodanie liczby do nazwy pliku duplikatów jest prawdopodobnie najłatwiejszym sposobem na zrobienie tego.

Skopiuj i wklej następujący plik wsadowy do Notatnika i zapisz go jako „flatten.cmd” (łącznie ze znakami cudzysłowu):

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

Aby użyć skryptu, po prostu przeciągnij na nim folder, który chcesz spłaszczyć.


1
Podobne, ale łatwiejsze do zrozumienia: superuser.com/a/523854/433830
aparente001

Uwaga: ten skrypt jest zasadniczo bombą widelcową. Używam go w folderze z tysiącami podkatalogów i dziesiątkami tysięcy podkatalogów, a wielkość pamięci powoli rośnie. Nie sądzę, żebym wpadł na problemy OOM, ale warto o tym pamiętać.
Nzall

@Nzall Nie mam problemu z przekonaniem, że tak się stanie, ale obwiniłbym Microsoft, a nie mój kod. Wszystko, co robię, to wywołuje podprogram w pliku wsadowym wiele razy. I nigdy nie uruchamiam więcej niż jednego na raz: każda podprogram działa aż do zakończenia, uruchamiając tylko jeden proces na raz. Ile pamięci mówimy o wykorzystaniu?
trlkly

@trlkly W pewnym momencie wzrosło do 2 GB, chociaż miałem dość dużą liczbę folderów i podfolderów, około 75 000 plików i tysiące folderów. Kilka chwil po tym, jak spadł z powrotem do około 8-900 MB. Było jednak mnóstwo zduplikowanych plików. Spłaszczałem 12 kopii biblioteki Javascript 7500 plików, aby przetestować, jak pewne oprogramowanie poradzi sobie z folderem z dziesiątkami tysięcy plików.
Nzall,

@Nzall To dla mnie niesamowicie dziwne. Nic, co robi skrypt, nie powinno tego robić. Jest to jeden podprogram, który wykorzystuje pojedynczą zmienną do zwiększenia pliku. Być może będę musiał zapytać, co może spowodować tak duże zużycie pamięci w SO lub coś takiego.
trlkly

11

Możesz spłaszczyć w Eksploratorze Windows, przechodząc do folderu, który chcesz spłaszczyć i szukając System.Kind:<>folderwykluczenia folderów z wyników.

Następnie możesz zaznaczyć wszystkie pliki za pomocą CTRL + A oraz skopiować i wkleić je w nowym folderze. Pamiętaj, że Eksplorator Windows zapyta, jak postępować ze zduplikowanymi nazwami plików.

wprowadź opis zdjęcia tutaj


1
zwróć uwagę, że aby to zadziałało, musisz wpisać „folder” w odpowiednim zlokalizowanym tłumaczeniu (na przykład w języku włoskim System.Kind:<>cartella)
JohnKiller,

0

Takie rozwiązanie jest łatwe dzięki powłoce uniksowej. Oto, co możesz zrobić z moją własną powłoką Hamilton C (w tym darmową wersją ). Możesz zrobić coś bardzo podobnego z bash Cygwin .

mv *\* .

Jeśli twój katalog jest naprawdę ogromny, możliwe jest, że znak wieloznaczny będzie zbyt długi w linii poleceń, aby system Windows mógł przejść do procesu potomnego. ( Wywołanie CreateProcess systemu Windows ogranicza listę argumentów do znaków Unicode o wielkości 32 KB). Ale powłoka C nie ma wewnętrznego limitu, więc możesz iterować całą listę w ten sposób:

foreach i ( *\* )
   mv $i .
end

Do punktu @ MarkAllen powyżej, ten rodzaj zakłada, że ​​nie ma zduplikowanych nazw. Jeśli tak, późniejsze kopie na liście zastąpią starsze. Jeśli jest to problem, możesz iterować pliki, zapisując mvje tylko wtedy, gdy nie nadpisujesz. :tOperator jest operatorem ogon . -eOperatora jest plik istnieje testu .

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

To wciąż pozostawia puste katalogi, których być może nie chcesz po ich opróżnieniu. To może być kolejna iteracja, jeśli ma to znaczenie.


Korzystanie z cygwin> mv *. mv: nie można stat `* ': Brak takiego pliku lub katalogu
więcej niż pięć

W Cygwin bash, mv */* .pracuje dla mnie.
Nicole Hamilton,

3
Niektóre osoby są tak naprawione w UNIXism ... Jeśli naprawdę chcesz wykonywać skrypty w Windows 7, jest PowerShell, nie potrzebujesz fałszywego symulatora bash, takiego jak Cygwin.

Nie potrzebujesz nawet programu PowerShell. Zwykła linia poleceń wciąż istnieje i może robić te same rzeczy. Zobacz moją odpowiedź poniżej.
trlkly
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.