Làm cách nào để tôi nhận được tệp mới nhất từ ​​danh sách các tệp trong một thư mục cụ thể [đã đóng]


8

Tôi cần lấy tập tin mới nhất từ ​​danh sách các tập tin trong một thư mục cụ thể.

Khi tôi chạy tập lệnh lần đầu tiên tôi đã sao chép danh sách các tập tin trong một thư mục cụ thể sang một thư mục khác.

Từ lần chạy thứ hai, tôi cần lấy các tệp mới nhất từ ​​danh sách các tệp trong cùng thư mục để sao chép các tệp đó vào thư mục khác.

Ở lần chạy đầu tiên, tôi bắt ngày tạo tệp cuối cùng thành một biến, khi tập lệnh chạy lần thứ hai, các tệp lớn hơn ngày tạo tệp cuối cùng trong lần chạy đầu tiên; những tập tin này cần được sao chép vào thư mục khác.

Xin vui lòng bất cứ ai có thể giúp tôi ra để có được các tập tin mới nhất?


Bạn nên làm rõ ý định của bạn. Nếu tất cả những gì bạn muốn làm là đồng bộ hóa hai thư mục, thì các bước bạn yêu cầu không thể hiện cách tiếp cận tốt nhất.
Julie Pelletier

Câu trả lời:


22
ls -t1 |  head -n 1

Đầu tiên sẽ liệt kê tất cả các tệp được sắp xếp theo thời gian truy cập, sau đó chọn dòng đầu tiên.


4

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 -cnewernộ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, findcũ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/

4

Nếu bạn chỉ sao chép các tệp từ thư mục này sang thư mục khác dựa trên thời gian sửa đổi của chúng, bạn có thể cân nhắc rsync. Một cách rất đơn giản để làm điều tương tự có thể là:

rsync -t ./dir1/ ./dir2/

Hoặc chỉ để xem những gì nó sẽ làm thêm:

rsync -t --list-only ./dir1/ ./dir2/

Như Gilles lưu ý trong một bình luận dưới đây, có thể có những tình tiết giảm nhẹ làm cản trở việc sử dụng -ttùy chọn cho bạn. Nhưng nếu bạn mang bất cứ thứ gì ra khỏi đây để cho nó được mà bạn có thểnên kiểm tra về kết quả mà bạn mong muốn và rằng rsync's --list-onlylựa chọn là một phương tiện rất đơn giản để làm như vậy.

Ngoài ra, có lẽ ...

man rsync

Hãy cẩn thận: nếu các tệp bị xóa khỏi dir2nhưng không dir1, chúng sẽ được sao chép lại. Câu hỏi không có đủ thông tin để biết liệu đó có phải là vấn đề không.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Đúng. tarcó thể được tận dụng trong trường hợp đó. rsyncchính nó cũng cung cấp nhiều điểm đồng bộ hóa bổ sung như bạn muốn. Tuy nhiên, chắc chắn không có đủ dữ liệu trong câu hỏi để biết rằng đó là. Tôi thường xuyên giải quyết các vấn đề không có ở đó - nếu tôi không gây ra chúng - nhưng lần này thì không.
mikeerv

3

Nếu mục tiêu thực tế của bạn là di chuyển một loạt các tệp dựa trên thời gian sửa đổi và phiên bản hệ thống của bạn findhỗ trợ -newerXYloại thử nghiệm, bạn có thể làm một cái gì đó như

find -type f -newermt "@$lasttime" -exec mv -t path/to/destination/ {} +

nơi $lasttimelà lần sửa đổi tập tin mà bạn đã lưu trước đó, chỉ trong vài giây kể từ kỷ nguyên (ví dụ như lấy từ stat -c %Y yourfile).

Bạn cũng có thể sử dụng find -newer somefilehoặc find -newermm somefileso sánh trực tiếp thời gian sửa đổi với thời gian của tệp tham chiếu, thay vì lưu dấu thời gian của tệp tham chiếu trong một biến.

Để giới hạn lựa chọn vào thư mục hiện tại (loại trừ thư mục con), bạn có thể thêm -maxdepth 1vào findlệnh.

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.