Sự cố với lệnh cài đặt để sao chép toàn bộ thư mục


16

Vì vậy, tôi có một repo với một số tệp cấu hình của mình và tôi đang cố gắng tạo một makefileđể cài đặt chúng trong homedir. Vấn đề tôi gặp phải là khi tôi chạy lệnh sau trong bash

install -m 755 -d ~/path/to/dotfilesDir/ ~/

dường như không có gì xảy ra trong khi

install -m 755 ~/path/to/dotfilesDir/{file1,file2,...} ~/

hoạt động như dự định.

Tại sao giải pháp đầu tiên (dễ dàng và sạch sẽ hơn) hoạt động?



Tôi chỉ sử dụng cp với -r. Tôi thực sự không hiểu tại sao cài đặt không có tùy chọn -r như cp có.
ibrahim

Câu trả lời:


7

Từ cái nhìn vào trang người đàn ông , có vẻ như installsẽ không làm những gì bạn muốn.

Thật vậy, phần Tóm tắt chỉ ra cách sử dụng biểu mẫu:

install [OPTION]... -d DIRECTORY...

và sau đó, trang người đàn ông nói:

-d, --directory
coi tất cả các đối số là tên thư mục; tạo tất cả các thành phần của các thư mục được chỉ định

Vì vậy, dường như điểm của tùy chọn này là có thể cài đặt một cấu trúc thư mục phức tạp (nhưng trống rỗng) mkdir -p ....

Bạn có thể thực hiện những gì bạn muốn với một vòng lặp:

for file in /path/to/DotFiles/dir/*;do
    install -m 755 "$file" ~/
done

Hoặc, nếu có nhiều cấp độ /path/to/DotFiles/dir, bạn có thể sử dụng find:

find /path/to/DotFiles/dir/ -type f -exec 'install -m 755 "{}" ~/' +

Tạo tất cả các thành phần của các thư mục được chỉ định = Tạo các thư mục con nhưng không phải các tệp?
nathdwek

@nathdwek Phải. Bằng cách này, bạn có thể tạo cấu trúc thư mục (bộ xương) phức tạp bên dưới, giả sử, thư mục chính của bạn bằng cách sử dụnginstall -m 755 -d ~/foo/bar/baz
Joseph R.

1
-exec 'install -m 755 "{}" ~/' +sẽ không hoạt động, ít nhất là không phải trên phiên bản linux (tất cả? nhất?). Có thể làm việc trên OSX hoặc một cái gì đó. Sử dụng một cái gì đó như thế này là khá dễ dàng nếu bạn muốn một oneliner: 1. tạo thư mục đệ quy: for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done2. tạo các tệp đệ quy:for f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
Josh M.

6

Bắt đầu từ câu trả lời của @Joseph R., đây là giải pháp của tôi để làm cho nó hoạt động với tìm kiếm, vì tôi không thể làm cho lệnh của anh ấy hoạt động. (Tôi không nghĩ vậy, vì các quy tắc áp dụng cho \+: không thể có gì sau {}phần tử.) (Tôi không thể nhận xét. Toàn bộ đoạn này thực sự có thể bị xóa.)

Để sao chép tất cả các tệp vào cùng một thư mục (tại đây target/directory):

find directory/to/copy -type f -exec install -Dm 755 "{}" "target/directory" \;

-D không bắt buộc ở đây, nó sẽ chỉ tạo các thư mục không tồn tại cho mục tiêu.

Để sao chép toàn bộ hệ thống phân cấp thư mục và các tệp của nó (điều này sẽ bỏ qua các thư mục trống) bắt đầu từ nơi bạn hiện đang ở:

find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;

Như đã nói, điều này sẽ tạo lại cây bắt đầu từ $PWD. Ngoài ra, nếu bạn cần phải sao chép vào thư mục rỗng, trên có thể tìm ra cách sử dụng -type dcủa findinstall -d.

Vì vậy, để sao chép cây, bắt đầu từ một thư mục không phải là $PWD:

(cd parent/directory && find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;)

Lưu ý cách parent/directorykhông được sao chép qua.

Thêm

Đối với những người sử dụng shell/fish, đây là dòng làm tương tự:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'
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.