Làm thế nào để mv một thư mục trong Linux giữ lại mtime của nó?


12

Tôi đang sử dụng CentOS 5.5 và muốn di chuyển một lượng lớn thư mục trong một tập , giữ lại chúng mtime.

Giải pháp tốt nhất tôi có thể tìm thấy là như thế này:

cp -p -r source/data target/
rm -rf source/data

Với hơn 1TB dữ liệu trên chia sẻ NFS, việc sao chép sẽ diễn ra mãi mãi. Tôi không muốn sao chép. Tôi muốn di chuyển ngay lập tức.

Khi tôi di chuyển một thư mục bằng cách sử dụng mv source/data target/, mtimethư mục (không phải các tệp) sẽ được đặt thành thời gian hiện tại. Điều này là do nội dung của thư mục tôi đang di chuyển được sửa đổi bởi thao tác này ( ..mục nhập đang trỏ đến một nút khác).

Tôi đã đưa ra một kịch bản shell sau đây tôi gọi mv_preserve_mtime.sh:

#!/bin/bash
# Moves source folder to target folder. 
# You are responsible for making sure the target does not exist, otherwise this blows up
export timestamp=`stat -c %y $1`
mv "$1" "$2"
touch --date="${timestamp}" $2

Chà, điều đó cũng không hiệu quả. Các thư mục mtimeđược khôi phục, nhưng tất cả các thư mục trong thư mục tôi di chuyển (chỉ những thư mục sâu 1 cấp) được mtimeđặt lại vì những lý do tôi không hiểu.

Có ai có một giải pháp thích hợp, hiệu quả và chính xác?


Tôi tự hỏi tại sao nỗ lực của bạn với touchkhông làm việc. Đây có phải là mvbước hay touchbước thay đổi thời gian của các thư mục con? Hệ điều hành nào trên máy chủ NFS và (nếu bạn biết) loại hệ thống tập tin nào?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Tôi không biết tại sao nó lại xảy ra. Đó là mvbước gây rắc rối. Máy chủ NFS thực sự là một bộ lưu trữ NetApp, tôi hầu như không biết gì về phần bên trong của nó.
Roman Zenka

1
Cảm ơn. Tôi nghi ngờ đó là một sự kỳ quặc của NetApp. Nếu không thì touchnên làm việc. Bằng cách này, một cách di động hơn sẽ được touch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Rất thú vị, không nhận ra statlà không di động.
Roman Zenka

Câu trả lời:


15

POSIX mvkhông cung cấp bất kỳ tùy chọn nào để yêu cầu bảo quản atime / mtime, nhưng vì hoạt động là cục bộ với cùng một âm lượng, bạn có thể yêu cầu cpsử dụng liên kết cứng thay vì sao chép dữ liệu của các tệp thông thường bằng -ltùy chọn:

cp -p -r -l source/date target/
rm -rf source/data

Vì chỉ các thư mục và tài liệu tham khảo tệp sẽ thực sự được sao chép, nên nó sẽ đi nhanh hơn nhiều:

Để biết thêm thông tin về các liên kết cứng, bạn có thể tham khảo trang Wikipedia tương ứng

Về lý do tại sao thư mục con mtime được đặt lại với giải pháp hiện tại của bạn, đó là vì bạn chỉ nhận và khôi phục thư mục mẹ mtime: touch không phải là lệnh đệ quy.


Mtime phức tạp hơn thế. Chỉ có thư mục mẹ và các thư mục trực tiếp dưới nó đã thay đổi thời gian. Tất cả các thư mục khác vẫn giữ nguyên. Người ta sẽ mong đợi mỗi thư mục sẽ được thay đổi, hoặc chỉ cha mẹ.
Roman Zenka

1
Trên thực tế, điều này có ý nghĩa: 1) Thư mục mẹ có mtime tốt vì nó được đặt rõ ràng bằng cảm ứng, 2) Các mục nhập thư mục được tạo lại với thư mục mẹ, nhưng mtime của chúng không được khôi phục thủ công (cấu trúc thư mục Unix và định dạng inode) 3) Phần còn lại của cấu trúc cây không thực sự thay đổi, vì chúng tôi vẫn ở cùng một âm lượng: Đó là lý do tại sao mvkhông có tùy chọn "đệ quy", việc chuyển xuống thư mục con chỉ được thực hiện nếu cần sao chép thực tế (ví dụ các tập khác nhau).
Eureka

@Eureka: Giải thích tốt, nhưng tại sao nó lại được thực hiện theo cách này? Nếu tôi đã thực hiện mvtrên một thư mục data, tôi sẽ chỉ cần thay đổi ..trong datanội dung 's và sửa đổi sourcetargetthư mục vào danh sách các mục xúc động đúng cách. Không có thư mục khác sẽ cần phải được chạm vào.
Roman Zenka

1
@Roman Zenka Sau một số tìm kiếm, hành vi này dường như được chỉ định khá lỏng lẻo giữa Unices và hệ thống tập tin và phụ thuộc rất nhiều vào renameviệc triển khai tòa nhà bên dưới bởi hạt nhân và (các) hệ thống tập tin đã sử dụng, NFS thêm chia sẻ của nó vào vấn đề. Có một số con trỏ tham chiếu loại không nhất quán này: chắp vá.ozlabs.org / patch / 58833 bug.opensolaris.org/bugdatabase/ phỏng
Eureka

@Eureka: Tôi thấy cực kỳ khó tin rằng một cái gì đó tôi sẽ xem xét rất cơ bản có thể là một mớ hỗn độn như vậy. Đã gần năm 2011. Cảm ơn những tài nguyên đó!
Roman Zenka

4

Một giải pháp khác có thể là:

rsync -a --remove-source-files nguồn / dữ liệu đích /


Điều này dường như không hoạt động trên macOS.
Lenar Hoyt
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.