Di chuyển một tập tin và để lại một liên kết mềm phía sau


10

Tôi đang tìm kiếm một lệnh linux duy nhất cho phép tôi thực hiện tương đương với điều này:

cp /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

Nếu không có, cách tốt nhất để làm điều này cho một loạt các tệp là gì?


Tôi không biết Bash scripting cũng đủ để viết nó, nhưng giải pháp của tôi sẽ chỉ viết một kịch bản và gọi nó là một cái gì đó hấp dẫn như cpln
Unkwntech

1
Không nên cp là mv?
Bart van Heukelom

Không. Tùy chọn -f để tôi quan tâm đến điều đó.
innaM

1
dùng thử trên tệp 10
GB

2
@Hellooodbye Bạn đang bối rối &&với &. Như đã viết, dòng này kiểm tra giá trị trả về của cp và chỉ chạy phần thứ hai nếu nó thành công.
itadok

Câu trả lời:


7

Một lưu ý nhỏ là bạn có thể sử dụng ln cả hai lần để làm cho lệnh không thực sự di chuyển dữ liệu (giả sử cả hai đường dẫn nằm trên cùng một hệ thống tệp).

ln /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

Nhưng tôi giả sử rằng bạn muốn di chuyển nội dung của / some / path / sang một đĩa khác, sau đó tạo liên kết đến các tệp mới để "không ai" thông báo.

for f in `ls /some/path/`; do ln /some/path/$f /another/path/ && ln -sf /another/path/$f /some/path; done

Gói nó trong một hàm bash:

function cpln {
    for f in `ls $1`
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}

Có cách nào để thực hiện công việc này nếu những gì tôi đang di chuyển là một thư mục không?
tladuke

Làm thế nào để di chuyển các tập tin thực tế trên đĩa?
Ibrahim

Ibrahim: dữ liệu không di chuyển, nó chỉ cập nhật các con trỏ trong thư mục.
Mr Shark

tladuke: Có và không. Vì thư mục rất nhiều trên đĩa, không cần thủ thuật ln (không hoạt động cho các giám đốc), chỉ cần thực hiện một mv :-)
Mr Shark

2

Có tập lệnh của tôi mà bạn có thể sử dụng (lấy hai tham số / some / path / file và / other / path /):

#!/bin/bash
cp $1 $2
if [ "$?" -ne "0" ]; then
    echo "Some error"
    exit 1
    fi
ln -sf $2/${1##*/} ${1%/*}

Thủ thuật tuyệt vời với các thao tác chuỗi, chưa bao giờ thấy điều đó trước đây. Cảm ơn!
itadok

1

Nghiêm túc mà nói, tôi nghĩ rằng đây là một câu hỏi thực sự dễ dàng.

Đây là những gì tôi có thể làm trong perl:

#!/bin/perl
# Usage: cpln TARGETDIR SOURCE...
# Example: find tree/ -type f | xargs cpln commands/

$target = shift;

foreach(@ARGV) {
    m[(.*)/([^/]+)];
    system("cp $_ $target");
    system("ln -sf $target/$2 $1/");
}

Tôi đã hy vọng cho một cái gì đó thanh lịch hơn, nhưng tôi đoán tôi sẽ sử dụng nó.


1
Để thực hiện "trong Perl", bạn nên sử dụng File :: Copy (hoặc tương tự) và symlink (). Perl không phải là vỏ; tránh system () và đặc biệt tránh truyền toàn bộ dòng lệnh cho system () (ví dụ: nếu một đối số có chứa khoảng trắng thì sao?). Dù bằng cách nào, luôn luôn, luôn luôn, LUÔN LUÔN kiểm tra giá trị trả về.
John Siracusa
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.