Trong zsh, tệp mới nhất trong thư mục hiện tại là
a=(*(om[1]))
latest_file=$a[1]
cp -p $latest_file /other/directory
( Vòng loại Glob đá, nhưng thật không may, kết quả vẫn là một danh sách ngay cả khi bạn chỉ yêu cầu một yếu tố, do đó là mảng tạm thời a
.)
Trong các shell khác, nếu bạn biết rằng tên tệp của bạn không thể chứa dòng mới hoặc ký tự không thể in được, bạn có thể sử dụng ls
:
latest_file=$(ls -t | head -n 1)
cp -p "$latest_file" /other/directory
Tuy nhiên, dường như những gì bạn thực sự yêu cầu là danh sách các tệp mới hơn một tệp cụ thể. Đối với điều này, bạn có thể sử dụng -cnewer
nội dung dựng sẵn find
để phát hiện các tệp có nội dung hoặc siêu dữ liệu đã thay đổi gần đây hơn một số tệp khác. Lưu ý rằng cách tôi gọi nó ở đây, find
cũng thu thập các tệp trong thư mục con.
find . -cnewer "$previous_latest_files" -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
Vấn đề vẫn là phát hiện tập tin mới nhất trước đó trên thực tế, vấn đề là ngày sao chép. Vì vậy, tạo một tập tin đánh dấu khi bạn thực hiện sao chép.
find . -cnewer marker_file -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
touch marker_file
Nếu các tệp vẫn còn trong thư mục đích, thì bạn có thể chỉ cần đồng bộ hóa hai thư mục. Lưu ý rằng nếu bạn xóa một số tệp cũ khỏi thư mục đích nhưng chúng vẫn còn trong thư mục nguồn, chúng sẽ được sao chép lại bằng phương thức này.
rsync -a . /other/directory/