đổi tên một thư mục lớn: nó có rủi ro không?


19

Có rủi ro khi đổi tên thư mục với 180GB bằng mvlệnh không?

Chúng tôi có một thư mục /datachứa 180GB.

Chúng tôi muốn đổi tên /datathư mục /BD_FILESthành mvlệnh.

Có an toàn để làm điều đó?


14
Tại sao và làm thế nào nó nên có rủi ro? Nếu bạn không chắc chắn, hãy gọi mvvới -itùy chọn.
tráng miệng

5
Có bất cứ điều gì trong môi trường của bạn khiến bạn nghĩ rằng nó có thể có rủi ro?
Jeff Schaller

2
Bạn có nghĩa là liệu có rủi ro rằng hành động tự nó có thể gây ra vấn đề hay không, liệu có rủi ro nào có thể có tác động có vấn đề không? Nếu bạn có bất kỳ chương trình nào đang mong đợi có thư mục / data, thì việc đổi tên nó có thể gây ra sự cố.
Tích lũy

3
Lưu ý phụ: Hầu hết mọi thứ đều an toàn nếu bạn đã xác minh sao lưu. Không có gì là an toàn như nó nên nếu bạn không. Nói cách khác: khi hỏi "có an toàn không", suy nghĩ đầu tiên của bạn là "tôi đã xác minh bản sao lưu của mình chưa?"
RedGrittyBrick

2
Tôi có nghĩa là rủi ro có thể có vấn đề khi di chuyển thư mục lớn với dữ liệu của hệ điều hành này có thể ngăn chặn việc di chuyển ở giữa chẳng hạn hoặc mất dữ liệu
yael

Câu trả lời:


71

Thay đổi tên trên một thư mục là an toàn, nếu nó nằm trong cùng một hệ thống tệp.


Nếu đó là một điểm gắn kết (có /datavẻ như nó có thể là một điểm gắn kết với tôi, hãy kiểm tra điều này với mount), thì bạn cần phải làm một cái gì đó ngoài việc đơn giản mvmv /data /BD_FILESsẽ di chuyển dữ liệu đến phân vùng gốc (có thể không phải là cái gì bạn muốn xảy ra)

Bạn nên ngắt kết nối hệ thống tệp, đổi tên thư mục hiện trống, cập nhật /etc/fstabvị trí mới cho hệ thống tệp này và sau đó kết nối lại hệ thống tệp tại vị trí được đổi tên.

Nói cách khác,

  1. umount /data
  2. mv /data /BD_FILES(giả sử /BD_FILESkhông tồn tại, trong trường hợp đó, hãy di chuyển nó ra khỏi đường đi trước)
  3. cập nhật /etc/fstab, thay đổi điểm gắn kết từ /datađến/BD_FILES
  4. mount /BD_FILES

Điều này không liên quan đến việc sao chép bất kỳ tệp nào xung quanh, nó chỉ thay đổi tên của thư mục đóng vai trò là điểm gắn kết cho hệ thống tệp.


Nếu việc đổi tên thư mục liên quan đến việc di chuyển nó sang một hệ thống tệp mới (ví dụ như trường hợp /datanằm trên một đĩa trong khi /BD_FILESở trên một đĩa khác, chẳng hạn, một việc thường làm nếu bạn chuyển mọi thứ sang phân vùng lớn hơn chẳng hạn) , Tôi khuyên bạn nên sao chép dữ liệu trong khi giữ nguyên bản gốc cho đến khi bạn có thể kiểm tra xem bản sao đó có ổn không. Bạn có thể làm điều này với

rsync -a /data/ /BD_FILES/

ví dụ, nhưng xem rsynchướng dẫn để biết những gì nó làm và không làm (ví dụ: nó không bảo tồn các liên kết cứng).


Khi thư mục được đổi tên, bạn cũng cần đảm bảo rằng các quy trình hiện có (chương trình và người dùng sử dụng thư mục, bản sao lưu, v.v.) biết về việc thay đổi tên.


9
Có nguy cơ người ta mong đợi mvchỉ thực hiện một renamecuộc gọi hệ thống, nhưng do hoàn cảnh người ta không nhận ra rằng nó sẽ sao chép các tệp và xóa bản gốc. Nếu tôi cần tuyệt đối chắc chắn chỉ cần một renamecuộc gọi hệ thống được thực hiện và mvsẽ không làm điều gì đó "thông minh" sau lưng tôi, tôi mở một vỏ Python và sử dụng os.rename.
kasperd

3
Với một nhân Linux tương đối gần đây, bạn có thể di chuyển điểm gắn kết thay vào đó:mkdir /BD_FILES && mount -M /data /BD_FILES && rmdir /data
David Foerster

2
@MichealJohnson Điều đó có thể sẽ hoạt động trên hệ thống Linux, vâng. Điều gọn gàng rsynclà nó có thể khởi động lại.
Kusalananda

3
@MichealJohnson One sử dụng các công cụ mà người ta cảm thấy thoải mái nhất khi sử dụng, rõ ràng. Có, rsync -abảo tồn hầu hết tất cả các siêu dữ liệu, nhưng không phải liên kết cứng, ACL hoặc thuộc tính mở rộng (thêm -HAXvào đó).
Kusalananda

3
@Max Các bản phân phối khác nhau có các renamelệnh khác nhau với hành vi khác nhau. Tôi nghĩ đó là lý do đủ để không sử dụng renamelệnh khi bạn muốn chắc chắn những gì nó sẽ làm.
kasperd

16

Bạn không đổi tên mỗi tệp trong thư mục, bạn đổi tên một tệp trong /. Đó là bởi vì:

  1. thư mục là tập tin và
  2. hệ thống tập tin thực sự quan tâm đến inode, không phải văn bản thực tế.

Do đó, đổi tên một thư mục, bất kể có bao nhiêu tệp hoặc bao nhiêu dữ liệu trong đó, là chuyện nhỏ.


14

Nếu bạn chỉ đổi tên (nguồn và đích trong cùng một hệ thống tệp), thì đó chỉ đơn giản là đổi tên của một mục nhập thư mục. Nó thành công và thư mục có tên mới hoặc không thành công trong trường hợp không có gì thay đổi * .

Nếu nguồn và đích nằm trên các hệ thống tệp khác nhau, dữ liệu cần được sao chép theo mv. Sự khác biệt về tính năng hệ thống tệp, chẳng hạn như kích thước tệp tối đa, giới hạn về tên tệp, v.v., có thể gây ra sự cố. Để tránh vấn đề này, sao chép tập tin đầu tiên ( cp, rsync, ...) và sau khi sao chép hoàn tất thành công, loại bỏ các tập tin trong vị trí ban đầu.

* Tuy nhiên, có một số trường hợp góc, ví dụ được đề cập trong phần BUGS trong đổi tên người đàn ông 2


> "Nó thành công và thư mục có tên mới hoặc không thành công trong trường hợp không có gì thay đổi". Làm thế nào nó được đảm bảo? Có đúng với tất cả các hệ thống tập tin không? Có tài liệu nào về việc này không?
turbanoff

Đổi tên là một tòa nhà đơn lẻ, tuy nhiên có một lưu ý về NFS trong phần BUGS của đổi tên người đàn ông : đổi tên có thể thành công ngay cả khi lỗi được trả về khi sử dụng NFS (xem chi tiết trong trang man). Tôi đã thêm một ghi chú trong câu trả lời quá. Tôi không mong đợi bất kỳ hệ thống tập tin nào trong kernel để xem xét nó có thể chấp nhận được cho một mục nhập thư mục biến mất nếu việc đổi tên không thành công.
sebasth

8

Như những người khác đã nói, việc đổi tên một thư mục không gây ra rủi ro cố hữu cho nội dung. Nhưng có một loại rủi ro khác nhau mà bạn có thể muốn xem xét.

Các quy trình, tập lệnh, phím tắt do người dùng xác định và cấu hình tham chiếu vị trí ban đầu có thể bị phá vỡ bởi thay đổi này và ví dụ: nếu các đường dẫn được lưu trữ trong cơ sở dữ liệu, thì việc cập nhật chúng có thể là một công việc lớn.

Một điều bạn có thể làm là tạo một liên kết tượng trưng cho tên thư mục mới, nhưng để lại tên cũ trong một thời gian. Điều đó sẽ cho bạn thời gian để đánh giá tác động của sự thay đổi này. Bạn có thể tạm thời xóa tên cũ, xem có vấn đề gì không và nếu có, chỉ cần tạo lại tên cũ để mọi người có thể tiếp tục làm việc trong khi bạn tìm ra những gì cần được cập nhật.

Một lệnh như thế này sẽ làm điều đó: ln -s /data /BD_FILES


4
Một rủi ro nhẹ nữa mà chưa ai nhắc đến, đó là tùy thuộc vào chiến lược sao lưu của bạn cho thư mục đó, nó có thể dẫn đến các vấn đề về không gian đĩa và độ trễ trên ổ đĩa sao lưu do 180GB dữ liệu "mới" đột nhiên xuất hiện và cần phải được sao lưu.
Kent

Tôi thích một cái gì đó như mv thing1 thing2 ; ln --symbolic ./thing2 thing1. Bằng cách đó, tôi đã có tên mới và có thể dễ dàng kiểm tra sự vắng mặt của cái cũ bằng cách xóa liên kết tượng trưng.
can-ned_food

3

Đổi tên là nguyên tử. Rủi ro hợp lý duy nhất là mvquyết định sao chép mọi thứ vì một số lý do và sự cố xảy ra nửa chừng. Nếu bạn có GNU mv, mv -Tsẽ loại bỏ rủi ro này.

mv -Tnói mvrằng nó đang di chuyển đến một thư mục không; Điều này sẽ khiến nó từ chối thực hiện mkdir(), điều này sẽ khiến nó bị lỗi nếu di chuyển một thư mục và nó đã quyết định sao chép vì một số lý do.

Tôi đã tham gia vào việc xua đuổi bọ xít mv -Ttrong khi làm luận án thạc sĩ nhiều năm trước. Nó được sử dụng để làm điều sai trên quá nhiều trường hợp cạnh.

Mặt khác, bạn có 180GB dữ liệu người dùng trên phân vùng gốc. Bạn có thể muốn di chuyển cái này ra khỏi phân vùng gốc.


Bạn có thể chỉ có thể nói từ tên một mình nếu có cái gì đó trong "phân vùng gốc" hay không.
Peter

@Peter: Nếu nó không nằm trên phân vùng gốc thì đó là một mountpoint. Bạn không thể đổi tên các điểm gắn kết bằng lệnh mv.
Joshua
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.