Bạn đang đi đúng hướng (đối với một giải pháp đơn giản hơn, chỉ chạy 2 hoặc 3 lệnh, xem bên dưới). Bạn nên sử dụng *
thay vì ./
loại bỏ thư mục hiện tại¹ và điều này giúp đơn giản hóa việc cắt phần nghìn giây, sau đó chỉ cần đưa kết quả vào GNU parallel
hoặc xargs
²:
find * -type d | cut -c 1-10 | parallel date --date=@{} +%c
để có được
Sat 12 Sep 2015 08:35:11 CEST
Sun 13 Sep 2015 10:50:11 CEST
Mon 14 Sep 2015 08:35:21 CEST
và để thêm giây bù trước đó như ví dụ của bạn chỉ ra:
find * -type d | cut -c 1-10 | parallel 'echo "{} " $(date --date=@{} +%c)'
hoặc là:
find * -type d | cut -c 1-10 | xargs -I{} bash -c 'echo "{} " $(date --date=@{} +%c)'
để có được:
1442039711 Sat 12 Sep 2015 08:35:11 CEST
1442134211 Sun 13 Sep 2015 10:50:11 CEST
1442212521 Mon 14 Sep 2015 08:35:21 CEST
Tuy nhiên, nó đơn giản hơn để làm³:
find * -type d -printf "@%.10f\n" | date -f - +'%s %c'
một lần nữa giúp bạn có cùng một đầu ra được yêu cầu.
Nhược điểm của việc sử dụng *
là bạn bị giới hạn bởi dòng lệnh của mình cho việc mở rộng của nó, tuy nhiên ưu điểm là bạn có được các thư mục được sắp xếp theo giá trị dấu thời gian. Nếu số lượng thư mục là một vấn đề sử dụng -mindepth 1
, nhưng mất thứ tự:
find ./ -mindepth 1 -type d -printf "@%.10f\n" | date -f - +'%s %c'
và chèn sort
nếu cần:
find ./ -mindepth 1 -type d -printf "@%.10f\n" | sort | date -f - +'%s %c'
¹ này giả định không có thư mục con lồng nhau, như có vẻ là trường hợp từ ví dụ của bạn. Bạn cũng có thể sử dụng ./ -mindepth 1
thay vì*
² Bạn có thể thay thế parallel
bằng xargs -I{}
ở đây như @hobbs và @don_crissti đề xuất, nó chỉ dài dòng hơn.
³ dựa trên Gilles' câu trả lời cho sử dụng date
của khả năng tập đọc
Fri Oct 2 05:35:28 47592
)