2010-08-08 38 views
9

Tôi đang cố gắng lưu trữ tất cả các tệp cấu hình tiểu sử của mình (~/.xxx) trong git. Tôi khá khủng khiếp trong kịch bản bash nhưng tôi tưởng tượng điều này sẽ được khá thẳng về phía trước cho bạn rất kinh kịch kịch bản.Tập lệnh Bash để tạo an toàn các liên kết tượng trưng?

Về cơ bản, tôi muốn một tập lệnh sẽ tạo liên kết tượng trưng trong thư mục chính của tôi tới các tệp trong repo của tôi. Twist là, tôi muốn cảnh báo và nhắc ghi đè nếu liên kết tượng trưng sẽ ghi đè lên một tệp thực sự. Nó cũng sẽ nhắc nhở nếu một liên kết sym sẽ bị ghi đè, nhưng đường dẫn đích là khác nhau.

Tôi không ngại chỉnh sửa tập lệnh theo cách thủ công cho từng liên kết mà tôi muốn tạo. Tôi quan tâm hơn đến việc có thể nhanh chóng triển khai các tập lệnh cấu hình mới bằng cách chạy tập lệnh này được lưu trữ trong repo của tôi.

Bất kỳ ý tưởng nào?

Trả lời

14

Lệnh ln đã bảo thủ về xóa, như vậy có lẽ cách tiếp cận KISS là đủ tốt cho bạn:

ln -s git-stuff/home/.[!.]* . 

Nếu một tập tin hoặc liên kết đã tồn tại, bạn sẽ nhận được một thông báo lỗi và liên kết này sẽ bị bỏ qua.

Nếu bạn muốn các tập tin để có một cái tên khác nhau trong kho của bạn, vượt qua tùy chọn -n-ln để nó không vô tình tạo ra một liên kết tượng trưng trong một thư mục con hiện có của tên đó:

ln -sn git-stuff/home/profile .profile 
... 

Nếu bạn cũng muốn có liên kết trong các thư mục con của thư mục chính, cp -as tạo lại cấu trúc thư mục nhưng tạo liên kết tượng trưng cho các tệp thông thường. Với tùy chọn -i, nó sẽ nhắc nếu một mục tiêu đã tồn tại.

cp -i -as git-stuff/home/.[!.]* . 

(câu trả lời của tôi giả định GNU ln và GNU cp, chẳng hạn như bạn muốn tìm trên Linux (và Cygwin) nhưng thường không phải trên unices khác.)

+1

+1 cho cp -s, tôi không biết rằng đã tồn tại! RTFM phải không? – Mosby

1

Sau đây đã điều kiện chủng tộc, nhưng nó là có thể an toàn như bạn có thể nhận mà không có giao dịch hệ thống tệp:

# create a symlink at $dest pointing to $source 
# not well tested 
set -e # abort on errors 
if [[ (-h $dest && $(readlink -n "$dest") != $source) || -f $dest || -d $dest ]] 
then 
    read -p "Overwrite $dest? " answer 
else 
    answer=y 
fi 
[[ $answer == y ]] && ln -s -n -f -v -- "$source" "$dest" 
Các vấn đề liên quan