Cách sao chép tất cả các tệp HTML từ cây thư mục sang một thư mục


7

Tôi muốn sao chép tất cả các .htmltệp từ myDirvà thư mục con của nó sang ~/otherDir. Đây là những gì tôi đã thử, nhưng nó không hoạt động:

$ find myDir -name *.html -print | xargs -0 cp ~/otherDir
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory

Câu trả lời:


3

find myDir -name '*.html' -print0 | xargs -0 -J % cp % ~/otherdir


1
-J không có trong gnu xargs (4.4.2)
simpatico

@simpatico: Đó là một tiện ích mở rộng BSD, cho phép chuyển nhiều phần tử ngay cả khi có các đối số tiếp theo. Không có GNU AFAIK tương đương.
Gilles 'SO- đừng trở nên xấu xa'

12

Trước hết, hệ vỏ đang tạo ra '*' cho bạn. Hoặc thoát nó với \hoặc sử dụng dấu ngoặc kép xung quanh*.html

Thích như vậy:

find myDir -name "*.html" hoặc là find myDir -name \*.html

Bỏ qua việc sử dụng xargsvới find's -execswitch:

find myDir -name "*.html" -exec cp {} ~/otherDir \;

Điều này hoạt động vì {}thay thế vị trí của tệp findđược tìm thấy và được thực thi một lần cho mỗi trận đấu.

Cũng lưu ý rằng điều này sẽ làm phẳng bản sao của thư mục nguồn. Thí dụ:

myDir/a.html
myDir/b/c.html

sẽ mang lại

otherdir/a.html
otherdir/c.html

trên mac tôi không có -t nhưng $ find MR -name "* .html" -exec cp ~ / debug {} \; in: "cp: / Users / simpatico / debug là một thư mục (không được sao chép)." cho mỗi tệp html
simpatico

Ồ, bạn đã không đề cập đến điều đó trong câu hỏi của bạn. Nó có thể hữu ích cho người khác nếu bạn có thể gắn thẻ câu hỏi của bạn bằng "osx". Bạn vẫn có thể làm điều này với -exec - Tôi sẽ chỉnh sửa câu trả lời của tôi.
Miles Strombach

Tồi tệ hơn, nó cũng sẽ sao chép cả hai mydir/a/a.htmlmydir/b/a.htmlsang otherdir/a.htmlvà nó hoàn toàn không thể dự đoán được cái nào sẽ được sao chép cuối cùng, đây có thể không phải là thứ bạn muốn ...
Shadur

1
@simpatico, bạn đã đặt hàng sai. Đó -exec cp {} ~/debug/ \;không -exec cp ~/debug {} \;phải là lý do khá rõ ràng một khi bạn nghĩ về nó ...
Shadur

4

Vì vậy, bạn muốn sao chép tất cả các .htmltệp trong một số thư mục nguồn và thư mục con của nó, tất cả vào một thư mục duy nhất (tức là thu gọn hệ thống phân cấp)?

Tiêu chuẩn POSIX :

find myDir -name '*.html' -type f -exec sh -c 'cp "$@" "$0"' ~/otherDir {} +

Lưu ý rằng ~/otherDirtrở thành tham số 0 cho trình bao trung gian, cho phép các tệp nguồn chính xác "$@". Rời khỏi thư mục đích bên ngoài shell có lợi thế bổ sung mà bạn sẽ không gặp phải khi trích dẫn các vấn đề nếu đó là một biến trong tập lệnh shell cha ( -exec sh -c 'cp "$@" "$0"' "$target").

Đối với các hệ thống cũ không có find … -exec … +:

find myDir -name '*.html' -type f -exec cp {} ~/otherDir \;

Tôi vỏ của bạn là bash ≥4 hoặc zsh:

shopt -s globstar  # only for bash, put it in your `.bashrc`
cp myDir/**/*.html ~/otherDir/

setopt globalstar không hoạt động trên bash 4.2 cả trên mac và linux.
simpatico

@simpatico: Xin lỗi, đó là shopt -s( setoptlà lệnh tương ứng trong zsh).
Gilles 'SO- đừng trở nên xấu xa'

Không được -type fđánh giá sau -name "*.html"? Mặc dù a.html là tên thư mục hợp lệ, tôi sẽ không mong đợi. Có thể -type fsẽ có ý nghĩa hơn trước khi kiểm tra tên tệp, nhưng tôi đoán hiếm khi có sự khác biệt về tốc độ thực hiện.
người dùng không xác định

2

Thử

find myDir -name '*.html' -exec cp -t ~/otherdir {} +

Một vấn đề với cách tiếp cận này là nó không tạo ra bất kỳ thư mục con nào để tất cả các tệp được đặt vào ~/otherDir và các tệp được đặt tên giống nhau nhưng trong các phần khác nhau của myDircây không bị sao chép.

Nếu điều này gây ra sự cố cho bạn thì bạn có thể sử dụng cách sau để tạo cùng một cây thư mục trong ~/otherDircây

find myDir -name '*.html' | cpio -pdm ~/otherdir

Tôi không có máy mac

find myDir -name '*.html' -print | xargs -I {} cp  {} ~/otherDir

hoặc nếu bạn có thể

find myDir -name '*.html' -print0 | xargs -0 -I {} cp  {} ~/otherDir

vì điều này sẽ an toàn cho các tệp có khoảng trắng trong tên.


@lain - bạn có nhận thấy cp giới hạn của tôi w / o -t không? Tôi thực sự có ý định không sao chép cấu trúc, vì vậy cmd sẽ là lý tưởng nếu nó hoạt động, nhưng viết cmd w / o -t không thực hiện được mẹo (tôi vẫn nhận được cách sử dụng được in).
simpatico

Không có lệnh "-t" bật "cp" trong Mavericks (ít nhất), vì vậy đó là giải pháp GNU / Linux.
Denis Barmenkov

@DenisBarmenkov Tôi tin rằng tôi đã giải quyết được khoảng một nửa câu trả lời của tôi.

2

OSX có hỗ trợ -execdir để tìm không?

 find ./myDir -name "*.html" -execdir cp {} /abspath/to/otherDir ";"

Gnu / find gợi ý sử dụng -execdir thay vì -exec cho hầu hết các trường hợp.


Nó làm . Vì vậy, làm tất cả (gần đây) BSD. -execdirsẽ tốt hơn trong trường hợp một thư mục được di chuyển trong khi findđang hoạt động, nhưng thật không may, nó không thể di động được.
Gilles 'SO- ngừng trở nên xấu xa'

0
ls myDir/*.html | xargs -I {} cp {} ~/otherDir

Đây chỉ là một biến thể tầm thường đối với các câu trả lời đã được đưa ra, với một vài nhược điểm. Ví dụ: nó chỉ tìm thấy các tệp ở cấp cao nhất myDirvà câu hỏi yêu cầu các tệp từ myDir và thư mục con của nó.
Scott
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.