Làm cách nào tôi có thể sao chép đệ quy các tệp bằng phần mở rộng tệp, giữ nguyên cấu trúc thư mục?


71

Tại dòng lệnh Linux, tôi muốn sao chép một tập hợp các .txttệp (rất lớn) từ một thư mục (và các thư mục con của nó) sang thư mục khác.

Tôi cần cấu trúc thư mục để giữ nguyên và tôi cần bỏ qua các tệp ngoại trừ các tệp kết thúc bằng .txt.


2
Có cp và tìm làm thẻ trong câu hỏi của bạn, điều đó có nghĩa là bạn bị ràng buộc với các tùy chọn này? Vì tập dữ liệu của bạn rất lớn, nên có lý khi cho rằng quá trình sao chép có thể bị gián đoạn vì một số lý do và bạn sẽ phải khởi động lại nó. Tôi không chắc phương pháp find / cp sẽ có thể tiếp tục chuyển và chỉ sao chép phần còn thiếu. Nếu bạn không bị ràng buộc với find / cp, bạn có thể xem xét rsync, thông minh hơn. Tùy chọn --exclude của nó sẽ cho phép bạn bỏ qua các tệp .txt.
vtest

Cuộc gọi công bằng - rsync có lẽ là lựa chọn tốt hơn. Không bị ràng buộc để tìm / cp. (Tôi sử dụng chúng anyway - rsync không được cài đặt trên máy từ xa, đó là một máy chủ web sống & Tôi muốn rời khỏi càng nhỏ của một dấu chân càng tốt)
unclaimedbaggage

Câu trả lời:


95

Bạn có thể sử dụng findcpio để làm điều này

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)

tại sao vậy tôi nghĩ rằng nó chỉ để giữ lại ngày sửa đổi tập tin.
Mubashar

7
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;

Bạn đang thiếu một .sau find. Cũng trên macOS 10.13.1, điều này đã hoạt động:find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \;
nghiệt ngã

2

Cách tiếp cận khác

find . -name '*.txt' -exec rsync -R {} path/to/dext \;


Tôi thích giải pháp này. Tôi đã từng find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \;làm một trường hợp không nhạy cảm và để bảo vệ quyền sở hữu và quyền.
MountainX

1

Cách dễ nhất mà làm việc cho tôi:

cp --parents -R jobs/**/*.xml ./backup/

Một lưu ý là bạn phải điều hướng đến thư mục "mong muốn" trước để "đường dẫn chính" là chính xác.

Ngoài ra, hãy đảm bảo rằng bạn đã kích hoạt các đệ quy đệ quy trong bash:

shopt -s globstar

1

Làm thế nào về bạn đầu tiên sao chép nó với

cp -r /old/folder /new/folder

sau đó vào thư mục mới và chạy

find . -type f ! -iname "*.txt" -delete

hoặc chỉ

cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete

Chỉnh sửa: ok bạn muốn có một lệnh lọc (Tôi chưa kiểm tra điều này vì hệ thống của tôi không có cpiolệnh!). Đây là nơi tôi tìm thấy nó: http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

find . -name "*.txt" -print0 |
     cpio -pmd0 /dest-dir

Vui lòng kiểm tra cái này trước, vì tôi chưa thử. Nếu ai đó sẽ xác minh, đó sẽ là tuyệt vời.


gật đầu Chúc mừng - điều này sẽ hoạt động, nhưng không lọc đến .txt Tôi đang xem một vài triệu tệp (sắp ra mắt với vài trăm GB). Nếu cần tôi có thể phải, nhưng tôi rất muốn lọc trong khi sao chép nếu có thể
không được yêu cầu

1
Chúc mừng, phiên bản đã chỉnh sửa hoạt động nếu tôi xóa '0' từ -pmd0
không được yêu cầu

Bạn nên giữ 0trong -pmd0và thêm -print0vào phần cuối của findlệnh (ngay trước |).
G-Man

1

Tôi đã cố gắng làm điều tương tự trên macOS, nhưng không có lựa chọn nào thực sự hiệu quả với tôi. Cho đến khi tôi phát hiện ra ditto.

Tôi đã phải sao chép nhiều tệp .wav và để nó bỏ qua các tệp Video ... Vì vậy, đây là những gì tôi nghĩ ra:

find . -type f -iname "*.wav" -ls -exec ditto {} /destination/folder/{} \;

  • find .- Chạy tìm trong thư mục hiện tại. hãy chắc chắn rằng bạn cd /source/foldertrước khi bắt đầu

  • -type f - Chỉ định chỉ tìm tệp

  • -iname "*.wav" - Điều này bảo nó tìm trường hợp không nhạy cảm * .wav
  • -ls- Điều này cho bạn thấy các tập tin mà nó đang làm việc. Mặt khác, nó không hiển thị gì cả.
  • -exec ditto {} /destination/folder/{} \; - Có phải tất cả các công việc sao chép và tạo các tệp với cùng một cây thư mục.

0

Điều hướng đến thư mục:

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

Nó hơi đơn giản hơn về phía trước và hùng mạnh, nếu bạn quản lý các biểu thức thông thường.


-1

Điều hướng đến thư mục:

cp '*.css' /path/to/destination

Bạn sẽ phải điều hướng đến từng thư mục trong thư mục, nhưng điều này tốt hơn hầu hết các tùy chọn tôi đã thấy cho đến nay.


Phương pháp này không đệ quy, nghĩa là đối với các thư mục lớn, bạn có thể thực hiện việc này trong một thời gian dài ...
Iain Reid
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.