2009-11-30 31 views
13

Tôi đang cố gắng thử nghiệm cách một tệp được tạo trước đây (tính bằng giây) bằng dấu gạch ngang trong câu lệnh if. Tôi cần ngày tạo, không sửa đổi.Kiểm tra ngày tệp có bash

Bạn có biết cách thực hiện điều này mà không cần sử dụng lệnh như find với grep?

+0

Có một số lệnh bạn có thể sử dụng để làm điều này và bash có thể gọi tất cả chúng. Tại sao sự ác cảm khi sử dụng các lệnh bên ngoài? UNIX được xây dựng trên triết lý của các công cụ làm một việc và một điều tốt. – paxdiablo

+0

sẽ kéo dài thời gian sửa đổi đủ - hoặc bạn có cần thời gian tạo không? – Joel

+0

Tôi thích thời gian tạo – JeffPHP

Trả lời

7

Dưới đây là câu trả lời tốt nhất mà tôi tìm thấy vào thời điểm hạnh phúc, nhưng nó chỉ cho lần sửa đổi:

expr `date +%s` - `stat -c %Y /home/user/my_file` 
+0

với% Z thay vì% Y bạn nhận ngày thay đổi cuối cùng (ngày tạo như trên máy của tôi) –

18

Tôi sợ rằng tôi cann't trả lời câu hỏi cho thời gian sáng tạo, nhưng đối với thời gian sửa đổi cuối cùng bạn có thể sử dụng sau đây để có được ngày kỷ nguyên, trong giây, vì filenamesửa đổi lần cuối:

date --utc --reference=filename +%s 

vì vậy, bạn có thể sau đó nên cái gì như:

modsecs=$(date --utc --reference=filename +%s) 
nowsecs=$(date +%s) 
delta=$(($nowsecs-$modsecs)) 
echo "File $filename was modified $delta secs ago" 

if [ $delta -lt 120 ]; then 
    # do something 
fi 

vv ..

Cập nhật Một cách elgant hơn để làm điều này (một lần nữa, sửa đổi chỉ có thời gian): how do I check in bash whether a file was created more than x time ago?

1

bạn có thể sử dụng ls với --full thời gian

file1="file1" 
file2="file2" 
declare -a array 
i=0 
ls -go --full-time "$file1" "$file2" | { while read -r a b c d time f 
do  
    time=${time%.*} 
    IFS=":" 
    set -- $time 
    hr=$1;min=$2;sec=$3 
    hr=$((hr * 3600)) 
    min=$((min * 60)) 
    totalsecs=$((hr+min+sec)) 
    array[$i]=$totalsecs 
    i=$((i+1)) 
    unset IFS  
done 
echo $((${array[0]}-${array[1]})) 
} 
2

Nếu hệ thống của bạn có stat:

modsecs=$(stat --format '%Y' filename) 

Và bạn có thể thực hiện phép toán như trong Câu trả lời của Joel.

Các vấn đề liên quan