Chuyện gì đã xảy ra khi tôi mv * phạm? Không có lỗi được hiển thị và bây giờ chỉ còn một thư mục. Tại sao?


12

Lệnh được thực thi là "mv space *" trong một thư mục có 14 GB dữ liệu.

mv *

du -hs 

giống nhau vậy 14 GB dữ liệu đã biến mất ở đâu? Tôi đã làm gì?


Cần thêm thông tin. Nền tảng nào?
Jarmund

4
@Jarmund Tôi nghĩ thật an toàn khi giả sử một số * nix, vì cả hai lệnh được đề cập đều là các lệnh phổ biến trên các hệ thống giống Unix. Về vấn đề này, tôi nghĩ thật an toàn khi nói rằng hầu hết các vỏ đều hoạt động như nhau. Vì vậy, chúng tôi có thể suy luận đủ để đưa ra một câu trả lời hữu ích mặc dù nền tảng chính xác không được nêu rõ ràng.
một CVn


Một cạm bẫy khác phải kể đến. Bạn KHÔNG BAO GIỜ nên chạy mvhoặc cpvới " " trên dữ liệu không đáng tin cậy. Đó là bởi vì " " được mở rộng và các tệp có tên như "--verbose" nhận các đối số dòng lệnh. Dùng gì để thay thế:cp ./* anotherFolder
VasyaNovikov 27/2/2015

Câu trả lời:


30

Tôi đoán là bash mở rộng ký tự đại diện, và do đó di chuyển mọi thư mục vào thư mục cuối cùng của bạn.

Ví dụ:

$ ls
test1  test2  test3  test4

$ mv *

$ ls
test4

$ ls test4
test1  test2  test3

Ở đây, mv *được mở rộng để mv test1 test2 test3 test4tương ứng với mv [OPTION]... SOURCE... DIRECTORYđịnh dạng. Vì vậy, mỗi thư mục được chuyển vào cái cuối cùng.


9
Điều này. Nhân tiện, nếu bạn muốn sử dụng *trong một mv(hoặc cp) thì hãy xem --target-directorycông tắc của họ . Nó đảm bảo rằng bạn không nhận được một chút bởi những thứ như thế này.
một CVn

2

Theo mô tả của @ssssteffff, với mv *, shell đang thực hiện mở rộng ký tự đại diện từ các tệp trong thư mục hiện tại. Tuy nhiên, hành vi của mvlệnh phụ thuộc vào số lượng đối số *mở rộng. Nếu có nhiều hơn hai đối số, thì đối số cuối cùng phải là một thư mục:

   mv [OPTION]... SOURCE... DIRECTORY

Vì thế,

Tôi đã tạo 5 tệp

$ touch 1 2 3 4 5
$ ls
1  2  3  4  5
$ mv *
mv: target ‘5’ is not a directory
$ ls
1  2  3  4  5

Bây giờ nếu tôi tạo một thư mục là tham số cuối cùng để mở rộng thẻ đại diện, thì:

$ mkdir 6
$ mv *
$ ls
6
$ ls 6
1  2  3  4  5

Bạn nên kiểm tra lại xem đối số cuối cùng là gì.

  • Nếu đối số cuối cùng là một thư mục, thì dữ liệu của bạn có lẽ an toàn.
  • Nếu tổng số đối số là 2 và đối số cuối cùng là một thư mục, thì dữ liệu của bạn có lẽ cũng an toàn.
  • Nếu tổng số đối số là 2 và đối số cuối cùng là một tệp thì chắc chắn tệp thứ hai sẽ biến mất.

Bạn có chắc là bạn đã không nhìn thấy lỗi như thế này không?

 mv: target ‘5’ is not a 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.