Sao chép các tệp cụ thể và giữ cấu trúc thư mục con


2

Tôi nhận được một thư mục chứa một lượng lớn tệp với các hậu tố khác nhau trong một số thư mục phụ.

Quy trình tự động hóa của tôi hoạt động như sau:

  1. Yêu cầu các mục Finder
  2. Nhận nội dung thư mục (tùy chọn thư mục phụ được chọn)
  3. Bộ lọc Finder Item (cho một hậu tố tệp cụ thể)
  4. Sao chép các mục Finder

Công việc này như một cái duyên vậy. Nhưng tất cả các tệp được sao chép trong cùng một thư mục đích gốc. Tôi cần giữ cấu trúc thư mục con. Ví dụ:

sourceFolder
    subfolderA
        fileA.jpg
        fileB.xls
        fileC.xls
    subfolderB
        fileC.jpg
        fileD.xls
        fileE.xls

Kết quả mong đợi (bộ lọc cho hậu tố tệp .xls):

destinationFolder
    subfolderA
        fileB.xls
        fileC.xls
    subfolderB
        fileD.xls
        fileE.xls

Kết quả hiện tại:

destinationFolder
    fileB.xls
    fileC.xls
    fileD.xls
    fileE.xls

Cập nhật

Tôi là một nhà phát triển. Vì vậy, một shell hoặc AppleScript cũng sẽ được chấp nhận. :)

Câu trả lời:


3
rsync -avh --include='*/' --include='*.xls' --exclude='*' path/to/sourceFolder/ path/to/destinationFolder

Lưu ý /ở cuối đường dẫn nguồn, điều đó quan trọng . Giải pháp này sẽ thêm tất cả các thư mục trống, nếu bạn không muốn chúng, hãy xem tùy chọn --prune-empty-dirs.

Với mở rộng cú đúp, bạn thực sự có thể bao gồm nhiều kiểu tệp hơn cùng một lúc, thay vì có

--include='*.xls' --include='*.pdf' --include='*.txt'

bạn có thể dùng

--include='*.'{xls,pdf,txt}

tuyệt quá. ty! tôi sẽ kiểm tra và quay lại với nó
Tino Rzig

Bạn có thể thêm tất cả các tùy chọn bạn muốn, phần quan trọng là bao gồm các loại trừ: bao gồm tất cả các thư mục (cần thiết cho đệ quy) và tất cả .xlscác tệp, sau đó loại trừ mọi thứ khác. Nếu bạn muốn nhiều thứ hơn như --deletethêm chúng vào lệnh của bạn.
Manuel

1

Tôi kết thúc với một kịch bản shell, hoạt động theo yêu cầu:

$ find ./sourceFolder -name "*.xls*" -type f -print0 | xargs -0 -I '{}' /usr/bin/rsync -avR "{}" "./destinationFolder/"

rsync -avh --include='*/' --include='*.xls' --exclude='*' sourceFolder/ destinationFolder? Với mở rộng cú đúp, bạn thực sự có thể bao gồm nhiều kiểu tệp hơn --include='*.'{xls,pdf,txt}.
Manuel

@Quản lý ty! Bất kỳ lợi thế / bất lợi của giải pháp của bạn?
Tino Rzig

Rằng bạn không ghép nối qua các đường ống, bạn chỉ cần gọi rsyncmột lần với các cờ phù hợp.
Manuel

0

Trong tập lệnh shell, bạn có thể sử dụng mkbom để tạo tệp BOM (hóa đơn vật liệu) có chứa danh sách các tệp mà bạn muốn sao chép. Sau đó, bạn có thể sử dụng lệnh ditto với tùy chọn --bom để chỉ sao chép các tệp được liệt kê trong tệp BOM.


ty! Bất kỳ lợi thế / bất lợi của giải pháp của bạn?
Tino Rzig
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.