Cấu trúc thư mục phẳng


15

Tôi có một loạt các thư mục trong các thư mục. Như thế này

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

Tôi muốn thu gọn tất cả các thư mục để tất cả các tệp trong thư mục1, thư mục 2, thư mục 3, ... thư mục n tồn tại trong thư mục gốc.

Cách nhanh nhất để làm điều này trong windows là gì?


5
Nó phụ thuộc, bạn muốn xử lý tên tệp trùng lặp như thế nào?
Mark Allen

Câu trả lời:


19

Không có lý do để sử dụng các công cụ đặc biệt hoặc thậm chí là kịch bản. Chỉ cần sử dụng chức năng tìm kiếm trong Explorer.

  1. Mở thư mục bạn muốn làm phẳng trong Explorer.
  2. Tạo một thư mục mới, chọn tất cả các tệp (nhưng không phải thư mục) và kéo chúng vào thư mục đó (Điều này sẽ tránh nhận được hai bản sao của các tệp đó.)
  3. Trong hộp tìm kiếm (cái bên phải của thanh địa chỉ), nhập *và nhấn Enter.
  4. Sau khi danh sách được điền, nhấp chuột phải và chọn tất cả, sau đó nhấp chuột phải và Cắt.
  5. Nhấn nút quay lại để quay lại thư mục gốc, sau đó nhấp chuột phải và dán.
  6. Nếu bạn có bất kỳ tên trùng lặp, bạn sẽ được nhắc về cách xử lý vấn đề này. Chọn tùy chọn thích hợp nhất cho trường hợp sử dụng của bạn. (Tôi cho rằng sẽ sao chép cả hai tệp.) Để tránh bị nhắc lại, hãy đảm bảo áp dụng điều này cho tất cả các tệp có hộp kiểm ở phía dưới.
  7. Chọn tất cả các thư mục, đảm bảo chúng trống bằng cách nhìn vào cửa sổ bật lên về số lượng tệp được chọn, sau đó xóa chúng.

Nếu bạn muốn có một kịch bản để bạn có thể bắt đầu và quên nó đi, điều đó cũng có thể được thực hiện. Lệnh thay thế mv *\* .khá dễ dàng ( for /r %f in (*.*) do @move "%~f" .) nhưng tôi chắc chắn rằng bạn muốn xử lý các bản sao mà không để chúng bị bỏ lại như trong câu trả lời của @Nicole Hamilton. Nối một số vào tên tệp của các bản sao có lẽ là cách dễ nhất để làm điều đó.

Sao chép và dán tệp bó sau vào Notepad và lưu nó dưới dạng "flatten.cmd" (bao gồm cả dấu ngoặc kép):

@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"

Để sử dụng tập lệnh, chỉ cần kéo thư mục bạn muốn làm phẳng lên trên tập lệnh.


1
Tương tự nhưng dễ hiểu hơn: superuser.com/a/523854/433830
aparente001

Lưu ý: kịch bản này thực chất là một quả bom ngã ba. Tôi đang sử dụng nó trên một thư mục có hàng ngàn thư mục con và hàng chục nghìn thư mục con và dung lượng bộ nhớ đang dần tăng lên. Tôi không nghĩ rằng tôi sẽ gặp phải các vấn đề OOM, nhưng đó là điều cần lưu ý.
Nzall

@Nzall Tôi không có vấn đề gì khi tin rằng nó có thể làm điều đó, nhưng tôi sẽ đổ lỗi cho Microsoft, không phải mã của tôi. Tất cả những gì tôi làm là gọi một chương trình con trong tệp bó nhiều lần. Và tôi không bao giờ chạy nhiều hơn một lần: mỗi chương trình con chạy cho đến khi hoàn thành, chỉ chạy một quy trình tại một thời điểm. Chúng ta đang nói về việc sử dụng bao nhiêu bộ nhớ?
trlkly

@trlkly Tại một thời điểm, nó đã lên tới 2 GB, mặc dù tôi đã có một lượng thư mục và thư mục con khá lớn, khoảng 75.000 tệp và hàng ngàn thư mục. Một lát sau nó giảm xuống còn khoảng 8-900 MB. Có rất nhiều tập tin trùng lặp mặc dù. Tôi đã làm phẳng 12 bản sao của thư viện Javascript 7.500 tệp để tôi có thể kiểm tra xem phần mềm nào đó sẽ xử lý một thư mục có hàng chục ngàn tệp.
Nzall

@Nzall Điều đó cực kỳ kỳ lạ với tôi. Không có gì kịch bản làm nên làm điều đó. Đây là một chương trình con sử dụng lại một biến duy nhất để tăng tệp. Tôi có thể phải hỏi những gì có thể gây ra việc sử dụng bộ nhớ lớn như vậy trên SO hoặc một cái gì đó.
trlkly

9

Bạn có thể làm phẳng trong Windows Explorer bằng cách điều hướng đến thư mục bạn muốn làm phẳng và tìm kiếm System.Kind:<>folderđể loại trừ các thư mục khỏi kết quả.

Sau đó, bạn có thể chọn tất cả các tệp có CTRL + A và sao chép và dán chúng vào một thư mục mới. Lưu ý rằng Windows Explorer sẽ hỏi bạn cách xử lý tên tệp trùng lặp.

nhập mô tả hình ảnh ở đây


1
lưu ý rằng để làm việc này, bạn cần nhập "thư mục" trong bản dịch được bản địa hóa tương ứng (ví dụ: bằng tiếng Ý System.Kind:<>cartella)
JohnKiller

0

Điều này là dễ dàng với một vỏ Unix. Đây là những gì bạn có thể làm với shell Hamilton C của riêng tôi (bao gồm cả phiên bản miễn phí .) Bạn có thể làm điều gì đó rất giống với bash Cygwin .

mv *\* .

Nếu thư mục của bạn thực sự rất lớn, có thể ký tự đại diện thành một dòng lệnh quá dài để Windows chuyển sang quy trình con. (Cuộc gọi Windows CreatProcess giới hạn danh sách đối số ở mức 32K ký tự Unicode.) Nhưng trình bao C không có giới hạn bên trong, do đó bạn có thể lặp lại toàn bộ danh sách theo cách này:

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

Theo quan điểm của @ MarkAllen ở trên, loại giả định này không có tên trùng lặp. Nếu có, các bản sao sau trong danh sách sẽ ghi đè lên các bản cũ hơn. Nếu đó là một mối quan tâm, bạn có thể lặp lại các tệp, mvchỉ sử dụng chúng nếu bạn không ghi đè. Các :tnhà điều hành là điều hành đuôi . Các -enhà điều hành là tập tin tồn tại nghiệm .

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

Điều này vẫn để lại các thư mục trống, có thể bạn không muốn sau khi chúng bị xóa. Đó có thể là lần lặp lại tiếp theo nếu nó quan trọng.


Sử dụng cygwin> mv *. mv: không thể thống kê `* ': Không có tệp hoặc thư mục như vậy
Hơn năm

Trong Cygwin bash, mv */* .làm việc cho tôi.
Nicole Hamilton

3
Một số người đã cố định trong UNIXism ... Nếu bạn thực sự muốn thực hiện kịch bản trong Windows 7, có PowerShell, bạn không cần một số trình giả lập bash không có thật như Cygwin.

Bạn thậm chí không cần PowerShell. Dòng lệnh thông thường vẫn tồn tại và có thể làm những điều tương tự. Xem câu trả lời của tôi dưới đây.
trlkly
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.