Cách sao chép cấu trúc thư mục nhưng chỉ bao gồm một số tệp nhất định (sử dụng tệp hàng loạt của windows)


103

Như tiêu đề đã nói, làm cách nào tôi có thể sao chép đệ quy cấu trúc thư mục nhưng chỉ bao gồm một số tệp. Ví dụ: cho cấu trúc thư mục sau:

folder1
  folder2
    folder3
      data.zip
      info.txt
      abc.xyz
    folder4
    folder5
      data.zip
      somefile.exe
      someotherfile.dll

Các file data.zipinfo.txt có thể xuất hiện ở khắp mọi nơi trong cấu trúc thư mục. Làm cách nào tôi có thể sao chép cấu trúc thư mục đầy đủ, nhưng chỉ bao gồm các tệp có tên data.zip và info.txt (tất cả các tệp khác nên bị bỏ qua)?

Cấu trúc thư mục kết quả sẽ giống như sau:

copy_of_folder1
  folder2
    folder3
      data.zip
      info.txt
    folder4
    folder5
      data.zip

Câu trả lời:


169

Bạn không đề cập đến việc nó có phải là hàng loạt không, nhưng nếu bạn có thể sử dụng ROBOCOPY, hãy thử điều này:

ROBOCOPY C:\Source C:\Destination data.zip info.txt /E

EDIT: Đã thay đổi /Stham số /Eđể bao gồm các thư mục trống.


Tôi có thể sao chép * .zip với cú pháp này không? Tôi đã thử chỉ viết * .zip thay vì data.zip, nhưng nó không sao chép các tệp mà chỉ sao chép các thư mục. Tôi cũng đã cố gắng .zip?
Niels Brinch

@Niels Brinch Có, bạn sẽ có thể làm điều đó. Dòng lệnh chính xác bạn đang sử dụng là gì?
aphoria

1
ROBOCOPY C: \ Nguồn C: \ Destination * .zip / E
Niels Brinch,

Kỳ dị. Bạn đang sử dụng hệ điều hành nào? Bạn có quyền đối với tệp / thư mục cần thiết không? Tôi vừa thử nghiệm trên Win 7 và *.ziplàm việc cho tôi.
aphoria

Có thật không!? Tôi cũng đang sử dụng Win 7. Khi tôi thử, nó không sao chép bất kỳ tệp nào. Chỉ các thư mục. Tôi sẽ thử lại. (trong khi chúng tôi đang ở đó, là những gì các cú pháp để bao gồm hơn * .zip - giả sử * .zip và * .jpg.
Niels Brinch

29

Một giải pháp thay thế sao chép từng tệp một và không yêu cầu ROBOCOPY:

@echo off
setlocal enabledelayedexpansion

set "SOURCE_DIR=C:\Source"
set "DEST_DIR=C:\Destination"
set FILENAMES_TO_COPY=data.zip info.txt

for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
    if exist "%%F" (
        set FILE_DIR=%%~dpF
        set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
        xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
    )
)

Câu lệnh for bên ngoài tạo ra bất kỳ sự kết hợp đường dẫn nào có thể có của thư mục con trong SOURCE_DIRvà tên trong FILENAMES_TO_COPY. Đối với mỗi tệp hiện có, xcopy được gọi. FILE_INTERMEDIATE_DIRgiữ đường dẫn thư mục con của tệp SOURCE_DIRcần được tạo trong đó DEST_DIR.


1
Tôi cần sao chép tất cả ảnh từ các thư mục và thư mục con, tập lệnh hàng loạt này đã hữu ích. Chỉ cần thay đổi dòng set FILENAMES_TO_COPY=data.zip info.txtở trên thànhset FILENAMES_TO_COPY=*.jpg
Kai Noack

Tôi gặp lỗi vì đường dẫn tệp có khoảng trắng trên đó (SOURCE_DIR = "C: \ Origin Test", DEST_DIR = "C: \ Dest Test", lỗi: Test "" không mong muốn vào lúc này). Tôi đã cố gắng thay đổi% var% bằng! Var! ở khắp mọi nơi, nhưng không thành công. Bất kỳ manh mối về cách giải quyết điều này? Toàn bộ cấu trúc có đầy đủ các tên thư mục với khoảng trắng.
ricardo.scholz

1
Hãy thử set "SOURCE_DIR=C:\Origin Test"set "DEST_DIR=C:\Dest Test". Lưu ý vị trí của dấu ngoặc kép.
sakra

13

thử kết xuất đường ống của find (tức là. đường dẫn tệp) vào cpio

find . -type f -name '*.jpg' | cpio -p -d -v targetdir/

cpio kiểm tra dấu thời gian trên các tệp đích - vì vậy nó an toàn và nhanh chóng.

loại bỏ -v để op nhanh hơn, khi bạn đã quen với nó.


2
@Christian nó phụ thuộc vào cpio không phải là một phần của cài đặt tiêu chuẩn.
Crashworks

8

Nếu Powershell là một tùy chọn, bạn có thể thực hiện điều này:

Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse

Nhược điểm chính là nó sao chép tất cả các thư mục, ngay cả khi chúng sẽ trống vì không có tệp nào phù hợp với bộ lọc bạn chỉ định. Vì vậy, bạn có thể kết thúc với một cây chứa đầy các thư mục trống, ngoài một số thư mục có các tệp bạn muốn.


Chạy lần thứ hai sẽ thay đổi điểm đến. (Nó đặt các tệp trong một thư mục con.) Đó là một hành vi ngớ ngẩn nếu bạn hỏi tôi. Bạn sẽ muốn chạy rm -r -ErrorAction:SilentlyContinue d:\destinationPathtrước khi sao chép để sửa lỗi đó.
MakotoE

7

Cảm ơn các câu trả lời trước. :)

Tập lệnh này có tên "r4k4copy.cmd":

@echo off
for %%p in (SOURCE_DIR DEST_DIR FILENAMES_TO_COPY) do set %%p=
cls
echo :: Copy Files Including Folder Tree
echo :: http://stackoverflow.com
rem     /questions/472692/how-to-copy
rem     -a-directory-structure-but-only
rem     -include-certain-files-using-windows
echo :: ReScripted by r4k4
echo.
if "%1"=="" goto :NoParam
if "%2"=="" goto :NoParam
if "%3"=="" goto :NoParam
setlocal enabledelayedexpansion
set SOURCE_DIR=%1
set DEST_DIR=%2
set FILENAMES_TO_COPY=%3
for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
)
goto :eof
:NoParam
echo.
echo Syntax: %0 [Source_DIR] [Dest_DIR] [FileName]
echo Eg.   : %0 D:\Root E:\Root\Lev1\Lev2\Lev3 *.JPG
echo Means : Copy *.JPG from D:\Root to E:\Root\Lev1\Lev2\Lev3

Nó chấp nhận biến "Nguồn", "Đích" và "Tên tệp". Nó cũng chỉ có thể sao chép loại tệp được chỉ định hoặc tên tệp chọn lọc.

Mọi cải tiến đều được hoan nghênh. :)


5

Chỉ với tìm kiếm và cp:

mkdir /tmp/targetdir
cd sourcedir
find . -type f -name '*.zip' -exec cp -p --parents {} /tmp/targetdir ";"
find . -type f -name '*.txt' -exec cp -p --parents {} /tmp/targetdir ";"

4

Tương tự như giải pháp của Paulius, nhưng các tệp bạn không quan tâm sẽ không được sao chép sau đó bị xóa:

@echo OFF

:: Replace c:\temp with the directory where folder1 resides.
cd c:\temp

:: You can make this more generic by passing in args for the source and destination folders.
for /f "usebackq" %%I in (`dir /b /s /a:-d folder1`) do @echo %%~nxI | find /V "data.zip" | find /v "info.txt" >> exclude_list.txt
xcopy folder1 copy_of_folder1 /EXCLUDE:exclude_list.txt /E /I

4

Để sao chép tất cả các tệp văn bản sang G: và giữ nguyên cấu trúc thư mục:

xcopy *.txt /s G:

điều này có thể hoạt động đệ quy, như sao chép tất cả .txt từ các thư mục con và bảo toàn cấu trúc thư mục liên quan đến thư mục cơ sở không?
Micka

3

Đó chỉ là hai lệnh đơn giản, nhưng tôi sẽ không khuyến nghị điều này, trừ khi các tệp bạn KHÔNG cần sao chép có dung lượng nhỏ. Đó là bởi vì điều này sẽ sao chép TẤT CẢ các tệp và sau đó xóa các tệp không cần thiết trong bản sao.

xcopy /E /I folder1 copy_of_folder1
for /F "tokens=1 delims=" %i in ('dir /B /S /A:-D copy_of_files ^| find /V "info.txt" ^| find /V "data.zip"') do del /Q "%i"

Chắc chắn, lệnh thứ hai hơi dài, nhưng nó hoạt động!

Ngoài ra, cách tiếp cận này không yêu cầu bạn tải xuống và cài đặt bất kỳ công cụ nào của bên thứ ba (Windows 2000+ BATCH có đủ lệnh cho việc này).


Cảm ơn rất nhiều. Như bạn đã đề cập, nó không phải là lý tưởng, bởi vì (trong trường hợp của tôi) các tệp phải được sao chép thường nhỏ, trong khi các tệp không nên sao chép lớn hơn (và có thể có rất nhiều).
M4N

2

Trong Linux và các hệ thống UNIX khác, sử dụng tarlệnh sẽ thực hiện việc này một cách dễ dàng.

$ tar cvf /tmp/full-structure.tar *data.zip *info.txt

Sau đó, bạn sẽ chuyển đến mục tiêu và:

$ tar xvf /tmp/full-structure.tar 

Tất nhiên bạn có thể chuyển đầu ra từ tar đầu tiên sang thứ hai, nhưng thấy nó hoạt động theo từng bước sẽ dễ hiểu và dễ giải thích hơn. Tôi đang thiếu cd / to / new / path / cần thiết trong lệnh sau - Tôi chỉ không nhớ cách làm điều đó bây giờ. Ai đó khác có thể thêm nó, hy vọng.

$ tar cvf -  *data.zip *info.txt |  tar xvf - 

Tar (gnutar) cũng có sẵn trên Windows, nhưng có lẽ tôi sẽ xcopytự mình sử dụng phương pháp trên nền tảng đó.


tar cvf /tmp/full-osystem.tar ** / data.zip ** / info.txt đã làm việc cho tôi
ssinganamalla

Cả "tar cvf /tmp/full-osystem.tar ** / data.zip ** / info.txt" và "tar cvf /tmp/full- architects.tar * data.zip * info.txt" đều cho tôi 3 lỗi : (1) "tar: * data.zip: Không thể thống kê: Không có tệp hoặc thư mục như vậy", (2) "tar * info.txt: Không thể thống kê: Không có tệp hoặc thư mục như vậy", (3) "tar: Thoát với tình trạng hỏng hóc do các lỗi trước đó ”. Từ thư mục whcih, tôi có thực hiện tất cả những điều này không? Tôi không hiểu phương pháp này.
dùng1271772

Câu hỏi đặt ra nói WINDOWS
Anfelipe

Win10 có WSL, điều này làm cho điều này hợp lệ. tar đã có sẵn trên Windows hơn 20 năm và việc sử dụng đường dẫn đã hoạt động kể từ những ngày MS-DOS. Trong bất kỳ môi trường shell nào, NKT đều quan trọng. PWD - thư mục làm việc hiện tại. Tôi sẽ thừa nhận rằng giải pháp này ít hơn cho người dùng cuối và nhiều hơn cho người dùng thành thạo hoặc lập trình viên.
JohnP

1
XCOPY /S folder1\data.zip copy_of_folder1  
XCOPY /S folder1\info.txt copy_of_folder1

CHỈNH SỬA: Nếu bạn muốn giữ lại các thư mục trống (khi đọc lại bài viết của bạn, bạn dường như sẽ sử dụng) hãy sử dụng / E thay vì / S.


1
nó không bảo toàn cấu trúc thư mục.
Paulius

Tùy chọn / E duy trì cấu trúc thư mục, bao gồm cả việc tạo các thư mục trống nếu cần. Tên tệp cũng hoạt động với ký tự đại diện (ví dụ: thư mục1 \ *. Zip). Tôi chỉ gặp lỗi "Không tìm thấy tệp" khi tôi chuyển cho nó một tên tệp đầy đủ không tồn tại (trong trường hợp đó, tôi nhận được "Không tìm thấy tệp - xxx.xxx 0 Đã sao chép (các) tệp". Khi tôi đặt cho nó một mẫu không trả về tệp nào (ví dụ: thư mục1 \ *. zzz), tôi chỉ nhận được "0 tệp (* s) đã sao chép".
gkrogers

1

Sử dụng giao diện dòng lệnh WinRAR, bạn có thể sao chép tên tệp và / hoặc loại tệp vào kho lưu trữ. Sau đó, bạn có thể giải nén kho lưu trữ đó vào bất kỳ vị trí nào bạn thích. Điều này bảo toàn cấu trúc tệp gốc.

Tôi cần thêm các tệp ảnh album bị thiếu vào điện thoại di động của mình mà không cần phải sao chép lại bản nhạc đó. May mắn thay, cấu trúc thư mục giống nhau trên máy tính và điện thoại di động của tôi!

Tôi đã sử dụng:

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C: \ Downloads \ music.rar = Lưu trữ sẽ được tạo
  • X: \ music \ = Thư mục chứa các tệp nhạc
  • Folder.jpg = Tên tệp tôi muốn sao chép

Điều này tạo ra một kho lưu trữ với tất cả các tệp Folder.jpg trong các thư mục con thích hợp.

Kỹ thuật này cũng có thể được sử dụng để sao chép các loại tệp. Nếu tất cả các tệp đều có tên khác nhau, bạn có thể chọn giải nén tất cả các tệp vào một thư mục duy nhất. Các tham số dòng lệnh bổ sung có thể lưu trữ nhiều loại tệp.

Thông tin thêm trong liên kết rất hữu ích này http://cects.com/using-the-winrar-command-line-tools-in-windows/


1

Đối với những người sử dụng Altap Salamander (trình quản lý tệp 2 bảng): trong tùy chọn của cửa sổ bật lên Sao chép, chỉ cần chỉ định tên tệp hoặc mặt nạ. Dễ dàng.


0

Tôi ổn với các biểu thức chính quy, lười biếng và không thích cài đặt, vì vậy tôi đã tạo một tệp hàng loạt tạo thư mục và sao chép bằng các lệnh vani DOS. Có vẻ tốn công sức nhưng đối với tôi nhanh hơn so với thực hiện nội soi robot.

  1. Tạo danh sách các tệp nguồn của bạn với các đường dẫn hoàn chỉnh, bao gồm cả ký tự ổ đĩa nếu có, trong một tệp văn bản.
  2. Bật biểu thức chính quy trong trình soạn thảo văn bản của bạn.
  3. Thêm dấu ngoặc kép quanh mỗi dòng trong trường hợp có dấu cách - chuỗi tìm kiếm (.*)thay thế chuỗi "\1"và nhấp vào thay thế tất cả
  4. Tạo hai dòng cho mỗi tệp - một để tạo thư mục, một để sao chép tệp (qqq sẽ được thay thế bằng đường dẫn đích) - chuỗi tìm kiếm (.*)thay thế chuỗi md qqq\1\nxcopy \1 qqq\1\nvà nhấp vào thay thế tất cả
  5. Xóa tên tệp khỏi đường dẫn đích - tìm kiếm \\([^\\^"]+)"\nthay thế\\"\n
  6. Thay thế trong đường dẫn đích (trong ví dụ này A:\srcB:\dest). TẮT biểu thức chính quy, tìm kiếm qqq"A:\src\thay thế B:\dest\và nhấp vào thay thế tất cả.

md sẽ tạo các thư mục lồng nhau. bản sao có thể sẽ hoạt động giống như xcopy trong ví dụ này. Bạn có thể muốn thêm / Y vào xcopy để ngăn xác nhận ghi đè. Bạn kết thúc với một tệp hàng loạt như vậy:

md "B:\dest\a\b\c\"
xcopy "C:\src\a\b\c\e.xyz" "B:\dest\a\b\c\e.xyz"

lặp lại cho mọi tệp trong danh sách ban đầu của bạn. Đã thử nghiệm trên Win7.


-1

Để làm điều này bằng cách kéo và thả, hãy sử dụng winzip, có một tùy chọn bảo toàn cấu trúc dir. Đơn giản chỉ cần tạo .zip mới ở cấp thư mục sẽ là thư mục gốc của bạn và kéo tệp vào.


Cảm ơn, nhưng tôi đang tìm kiếm một giải pháp được sử dụng từ các tệp script (hàng loạt). Vì vậy, không kéo & thả ...
M4N
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.