Trong môi trường GUI, kéo và thả bằng thay thế sẽ thay thế các tệp và toàn bộ thư mục (bao gồm cả nội dung) bằng bất cứ thứ gì đang được sao chép. Có cách nào để thực hiện cùng kết quả trực quan này với lệnh 'mv' không?
Trong môi trường GUI, kéo và thả bằng thay thế sẽ thay thế các tệp và toàn bộ thư mục (bao gồm cả nội dung) bằng bất cứ thứ gì đang được sao chép. Có cách nào để thực hiện cùng kết quả trực quan này với lệnh 'mv' không?
Câu trả lời:
Không phải với mv
.
Chức năng cốt lõi của mv
(mặc dù tên của nó) là đổi tên một đối tượng. Một trong những đảm bảo mà UNIX đưa ra là việc đổi tên là nguyên tử - bạn không bao giờ được phép đổi tên hoàn thành một phần. Bảo đảm này có thể rất hữu ích nếu bạn muốn thay đổi một tệp ( /etc/passwd
ví dụ) mà các chương trình khác có thể đang xem và bạn muốn chúng xem phiên bản cũ hoặc mới của tệp và không có khả năng nào khác . Nhưng một "đổi tên đệ quy" như bạn mô tả sẽ phá vỡ sự bảo đảm đó - bạn có thể dừng nó ở giữa và bạn có một cây nửa di chuyển và có thể là một mớ hỗn độn - và vì vậy nó không thực sự phù hợp với triết lý của mv
. Đó là suy đoán của tôi về lý do tại sao mv -r
không tồn tại.
(Đừng bận tâm đến việc mv
phá vỡ triết lý đó theo những cách khác, nhỏ hơn. Ví dụ, mv
thực sự làm cp
theo sau rm
khi di chuyển tệp từ hệ thống tệp này sang hệ thống tệp khác.)
Đủ triết lý. Nếu bạn muốn di chuyển đệ quy ("kéo thả") một cây từ nơi này sang nơi khác trên cùng một hệ thống tệp , bạn có thể nhận được hiệu quả và tốc độ mv
như sau (ví dụ):
cp -al source/* dest/ && rm -r source/*
Các -l
lá cờ để cp
có nghĩa là "tạo ra một liên kết cứng thay vì sao chép" - đó là một cách hiệu quả tạo ra một tên tập tin mới trỏ đến dữ liệu tập tin giống như tên tập tin cũ. Tuy nhiên, điều này chỉ hoạt động trên các hệ thống tệp hỗ trợ các liên kết cứng - vì vậy mọi hệ thống tệp UNIX-ish nguyên bản đều ổn, nhưng nó sẽ không hoạt động với FAT.
Có &&
nghĩa là "chỉ chạy lệnh sau nếu lệnh trước thành công". Nếu bạn thích, bạn có thể chạy hai lệnh một lần thay thế.
Tôi không nghĩ rằng bạn có thể sao chép hành vi kéo thả mà bạn mô tả mv
, vì các thư mục con không trống trong mục tiêu sẽ không được thay thế.
Có lẽ rsync
? Một cái gì đó như thế rsync -a -r source/ target/
nào? Chạy với -v -n
để thực hiện chạy khô trước tiên để đảm bảo nó làm những gì bạn muốn.
Có lẽ bạn sẽ muốn thay đổi câu trả lời chính xác cho điều này:
https://github.com/iaindooley/pickdrop
Thí dụ:
nói rằng tôi có:
test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png
và tôi muốn chuyển những thứ này đến / trang web
vì vậy nó trông giống như:
site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png
Tôi có thể đi:
cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop
Đây là nghĩa đen cắt và dán.