Làm cách nào để sử dụng lệnh UNIX find
để tìm kiếm các tệp được tạo vào một ngày cụ thể?
Làm cách nào để sử dụng lệnh UNIX find
để tìm kiếm các tệp được tạo vào một ngày cụ thể?
Câu trả lời:
Như Max đã chỉ ra, bạn không thể, nhưng kiểm tra các tệp được sửa đổi hoặc truy cập không quá khó. Tôi đã viết một hướng dẫn về điều này, muộn như ngày hôm nay. Bản chất của nó là sử dụng -newerXY
và ! -newerXY
:
Ví dụ: Để tìm tất cả các tệp được sửa đổi vào ngày 7 tháng 6 năm 2007:
$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
Để tìm tất cả các tệp được truy cập vào ngày 29 tháng 9 năm 2008:
$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30
Hoặc, các tệp có sự cho phép của họ đã thay đổi trong cùng một ngày:
$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30
Tuy nhiên, nếu bạn không thay đổi quyền trên tệp, 'c' thường sẽ tương ứng với ngày tạo.
-newerBt
sẽ khớp với thời gian sinh (tạo) của tệp .
-newerxt
này có sẵn trên FreeBSD từ năm 2001 (nơi nó được cung cấp lần đầu tiên dưới dạng bản vá vào năm 1998), một số BSD và GNU khác tìm thấy (kể từ 4.3.3 năm 2007), dựa trên tìm thấy HP / UX, được giới thiệu -newerXY
(nhưng ở đâu Y == t không được hỗ trợ).
find location -ctime time_period
Ví dụ về time_apse:
Hơn 30 ngày trước: -ctime +30
Chưa đầy 30 ngày trước: -ctime -30
Chính xác là 30 ngày trước: -ctime 30
ctime
không liên quan gì đến thời gian tạo , đó là thời gian thay đổi inode.
Đó là hai bước nhưng tôi thích làm theo cách này:
Đầu tiên tạo một tập tin với một ngày / thời gian cụ thể. Trong trường hợp này, tệp là 2008-10-01 lúc nửa đêm
touch -t 0810010000 /tmp/t
Bây giờ chúng tôi có thể tìm thấy tất cả các tệp mới hơn hoặc cũ hơn tệp trên (theo ngày sửa đổi tệp. Bạn cũng có thể sử dụng -anewer cho trạng thái tệp đã truy cập và -cnewer đã thay đổi).
find / -newer /tmp/t
find / -not -newer /tmp/t
Bạn cũng có thể xem các tệp giữa các ngày nhất định bằng cách tạo hai tệp bằng cảm ứng
touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2
Điều này sẽ tìm thấy các tập tin giữa hai ngày và thời gian
find / -newer /tmp/t1 -and -not -newer /tmp/t2
find
mà thiếu-newerXY
Bạn có thể làm điều này:
find ./ -type f -ls |grep '10 Sep'
Thí dụ:
[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235 4 -rw-r--r-- 1 root root 29 Dec 24 03:24 /var/lib/prelink/full
798227 288 -rw-r--r-- 1 root root 292323 Dec 24 23:53 /var/log/sa/sar24
797244 320 -rw-r--r-- 1 root root 321300 Dec 24 23:50 /var/log/sa/sa24
stat
nếu bạn không có find -printf
.
Bạn không thể. Công tắc -c cho bạn biết khi quyền được thay đổi lần cuối, -a kiểm tra thời gian truy cập gần đây nhất và -m kiểm tra thời gian sửa đổi. Hệ thống tập tin được sử dụng bởi hầu hết các hương vị của Linux (ext3) không hỗ trợ bản ghi "thời gian tạo". Lấy làm tiếc!
@Max: đúng về thời gian tạo.
Tuy nhiên, nếu bạn muốn tính những ngày tranh luận trôi qua cho một trong những -atime
, -ctime
, -mtime
thông số, bạn có thể sử dụng các biểu thức sau đây
ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))
Thay thế "2008-09-24" bằng bất cứ ngày nào bạn muốn và ELAPSED_DAYS sẽ được đặt thành số ngày trong khoảng thời gian từ đó đến hôm nay. (Cập nhật: trừ một từ kết quả để căn chỉnh với find
làm tròn ngày.)
Vì vậy, để tìm bất kỳ tệp nào được sửa đổi vào ngày 24 tháng 9 năm 2008, lệnh sẽ là:
find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))
Điều này sẽ hoạt động nếu phiên bản find
không hỗ trợ các -newerXY
vị từ được đề cập trong câu trả lời của @Arve :.
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
`ls ...`
công trình, nó không sử dụng find
công cụ.
Tôi đã tìm thấy tập lệnh này trong một tập lệnh xóa tất cả các tệp cũ hơn 14 ngày:
CNT=0
for i in $(find -type f -ctime +14); do
((CNT = CNT + 1))
echo -n "." >> $PROGRESS
rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG
Tôi nghĩ rằng một chút "người đàn ông tìm thấy" và tìm kiếm các tham số -ctime / -atime, vv sẽ giúp bạn ở đây.