Sắp xếp tệp theo thời gian sửa đổi


8

Tôi đã thấy nhiều câu hỏi và câu trả lời ở đây bằng cách sử dụng một công trình dọc theo dòng

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

hoặc là

ls -t | while read i; do

Bây giờ, tôi biết rằng bạn không nên sử dụng ls trong các tập lệnh vì nó dễ bị hỏng; nhưng tôi không thể tìm thấy cách vận hành tốt hơn trên các tệp theo thứ tự từ sửa đổi lần cuối đến sửa đổi gần đây nhất (hoặc ngược lại).

Tôi có thể sử dụng một cái gì đó như:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... nhưng điều này vẫn sẽ phá vỡ với bất kỳ tệp nào có dòng mới trong tên của họ và xấu hơn nhiều để khởi động. Có cách nào tốt hơn?

Câu trả lời:


8

"Không sử dụng ls trong tập lệnh" là vấn đề với POSIX ls "chỉ"; cho GNU ls xem --quoting-style=.

GNU sort giải quyết vấn đề với --zero-terminated.

Nếu nó phải tương thích thì bạn có thể sử dụng find ... -execđể chuyển một tên tệp tại một thời điểm cho tập lệnh thoát. Nếu ít nhất bash có sẵn:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb

Ahh, --zero-terminated- cảm ơn bạn vì điều đó, tôi ước tôi có thể cho bạn nhiều điểm hơn nữa!
evilsoup

... OK, tôi hơi bối rối bởi info ls: nếu tôi muốn một kịch bản chống đạn với ls, --quoting-styletôi nên sử dụng cái nào?
evilsoup

@evilsoup Mình nghĩ --quoting-style=escapelà cách chọn.
Hauke ​​Laging

Bây giờ, để tạo một số tệp có dòng mới trong tên của họ để kiểm tra nó: P
evilsoup

1
Ngoài ra: Tôi vấp phải một trường hợp cực đoan khi GNU ls --quoting-stylethất bại (vì phân tích cú pháp mục đích) vì nó chỉ trích dẫn tên tệp: khi bạn có một khoảng trắng trong tên nhóm. Ok, đó là một trường hợp rất can đảm, nhưng nó xuất hiện trong vỏ bash cygwin, ở đây bạn có tên nhóm như thế nào Domain Users.
DavAlPi

4

Cách dễ nhất cho đến nay là sử dụng zsh. Các glob vòng loại om sắp xếp các trận đấu theo thứ tự thời gian đảo ngược; sử dụng Omtheo thứ tự thời gian.

for x in /path/to/dir/*(Nom); do …

Vòng Nloại toàn cầu làm cho mẫu mở rộng thành một danh sách trống nếu thư mục trống. Làm điều này *(DNom)để phù hợp với các tập tin dấu chấm.


1
Dang, đây là lần đầu tiên tôi cảm thấy phiền khi nhìn vào những chiếc vỏ khác - điều đó thật tuyệt.
evilsoup
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.