'mv' tương đương với kéo và thả với thay thế?


19

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:


20

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/passwdví 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 -rkhông tồn tại.

(Đừng bận tâm đến việc mvphá vỡ triết lý đó theo những cách khác, nhỏ hơn. Ví dụ, mvthực sự làm cptheo sau rmkhi 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 độ mvnhư sau (ví dụ):

cp -al source/* dest/ && rm -r source/*

Các -llá cờ để cpcó 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.

&&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ế.


Vô cùng thông tin. Cảm ơn nhiều!
dùng7089

4

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.


3

mv -f /path/to/source/folder/* /destination/folder/

Sẽ di chuyển mọi thứ trong / path / đến / source / thư mục, bao gồm các tệp và thư mục đến / Destination / thư mục.

Và sẽ ghi đè lên các tập tin và thư mục hiện có.


2
Chỉ các thư mục trống
Kevin

1

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.


Rất mát mẻ, và chắc chắn đáng để xem xét. Tuy nhiên, câu hỏi cụ thể là về 'mv' vì vậy tôi nghĩ rằng tôi sẽ để lại câu trả lời đúng như câu hỏi giải thích triết lý đằng sau mv một cách chi tiết. Cảm ơn bạn vì sự đóng góp này, chắc chắn rất hữu ích.
dùng7089

Cũng đáng chú ý, từ readme: "Nó không mạnh mẽ chút nào - nó lưu trữ các lựa chọn của bạn trong ~ / .pick cho đến khi bạn gọi thả vào thời điểm nó sử dụng các đường dẫn tệp trong ~ / .pick để tạo tệp thực thi mới ~ / .drop để sao chép từng tệp bạn đã chọn vào thư mục làm việc hiện tại. "
dùng7089
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.