ฉันจะใช้คำสั่ง UNIX find
เพื่อค้นหาไฟล์ที่สร้างในวันที่ระบุได้อย่างไร
ฉันจะใช้คำสั่ง UNIX find
เพื่อค้นหาไฟล์ที่สร้างในวันที่ระบุได้อย่างไร
คำตอบ:
ตามที่ Max อธิบายไว้คุณไม่สามารถทำได้ แต่การตรวจสอบไฟล์ที่แก้ไขหรือเข้าถึงนั้นไม่ใช่เรื่องยาก ฉันเขียนบทช่วยสอนเกี่ยวกับเรื่องนี้จนถึงวันนี้ สาระสำคัญของการใช้-newerXY
และ! -newerXY
:
ตัวอย่าง: เพื่อค้นหาไฟล์ทั้งหมดที่แก้ไขในวันที่ 7 มิถุนายน 2007:
$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
หากต้องการค้นหาไฟล์ทั้งหมดที่เข้าถึงได้ในวันที่ 29 กันยายน 2008:
$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30
หรือไฟล์ที่ได้รับอนุญาตเปลี่ยนในวันเดียวกัน:
$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30
หากคุณไม่เปลี่ยนการอนุญาตในไฟล์ 'c' ตามปกติจะตรงกับวันที่สร้างแม้ว่า
-newerBt
จะจับคู่กับเวลาเกิด (การสร้าง) ของไฟล์
-newerxt
มีอยู่ในFreeBSDตั้งแต่ปี 2001 (ที่มันถูกจัดให้เป็นครั้งแรกเป็นแพทช์ในปี 1998) ไม่กี่ BSDs อื่น ๆ และ GNU หา (ตั้งแต่ 4.3.3 ในปี 2007) บนพื้นฐานของ HP / UX พบซึ่งแนะนำ-newerXY
( แต่ที่ Y == t ไม่รองรับ)
find location -ctime time_period
ตัวอย่างของ time_period:
มากกว่า 30 วันที่ผ่านมา: -ctime +30
น้อยกว่า 30 วันที่ผ่านมา: -ctime -30
ตรง 30 วันที่ผ่านมา: -ctime 30
ctime
ไม่มีอะไรเกี่ยวข้องกับเวลาการสร้างมันเป็นเวลาเปลี่ยน inode
มันเป็นสองขั้นตอน แต่ฉันชอบที่จะทำอย่างนี้:
สร้างไฟล์ด้วยวันที่ / เวลาที่ต้องการก่อน ในกรณีนี้ไฟล์คือ 2008-10-01 เวลาเที่ยงคืน
touch -t 0810010000 /tmp/t
ตอนนี้เราสามารถค้นหาไฟล์ทั้งหมดที่ใหม่กว่าหรือเก่ากว่าไฟล์ด้านบน (ไปตามวันที่แก้ไขไฟล์คุณสามารถใช้-anewerสำหรับการเข้าถึงและ-cnewerเปลี่ยนสถานะไฟล์)
find / -newer /tmp/t
find / -not -newer /tmp/t
คุณสามารถดูไฟล์ระหว่างวันที่กำหนดได้ด้วยการสร้างไฟล์สองไฟล์ด้วยการสัมผัส
touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2
จะเป็นการค้นหาไฟล์ระหว่างสองวันที่ & เวลา
find / -newer /tmp/t1 -and -not -newer /tmp/t2
find
ที่ขาด-newerXY
คุณสามารถทำได้:
find ./ -type f -ls |grep '10 Sep'
ตัวอย่าง:
[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
find -printf
คุณทำไม่ได้ สวิตช์ -c จะบอกคุณเมื่อสิทธิ์ถูกเปลี่ยนแปลงครั้งล่าสุด -a ทดสอบเวลาเข้าถึงล่าสุดและ -m ทดสอบเวลาแก้ไข ระบบไฟล์ที่ใช้โดย Linux ส่วนใหญ่ (ext3) ไม่รองรับการบันทึก "การสร้างเวลา" ขออภัย!
@ Max: ถูกต้องเกี่ยวกับเวลาในการสร้าง
แต่ถ้าคุณต้องการที่จะคำนวณวันอาร์กิวเมนต์ผ่านไปหนึ่งใน-atime
, -ctime
, -mtime
พารามิเตอร์คุณสามารถใช้นิพจน์ต่อไปนี้
ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))
แทนที่ "2008-09-24" ด้วยวันใดก็ได้ที่คุณต้องการและ ELAPSED_DAYS จะถูกตั้งค่าเป็นจำนวนวันระหว่างวันนั้นถึงวันนี้ (อัปเดต: ลบหนึ่งรายการจากผลลัพธ์เพื่อให้สอดคล้องกับfind
การปัดเศษวันที่)
ดังนั้นหากต้องการค้นหาไฟล์ที่ถูกแก้ไขในวันที่ 24 กันยายน 2008 คำสั่งจะเป็น:
find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))
สิ่งนี้จะใช้ได้หากเวอร์ชันของคุณfind
ไม่รองรับเพรดิเคตที่-newerXY
ระบุไว้ใน @Arve: คำตอบ
ด้วยสวิตช์ -atime -ctime และ -mtime เพื่อค้นหาคุณสามารถเข้าใกล้สิ่งที่คุณต้องการได้
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
`ls ...`
ทำงานมันไม่ได้ใช้find
เครื่องมือ
ฉันพบสคริปเล็ตนี้ในสคริปต์ที่ลบไฟล์ทั้งหมดที่เก่ากว่า 14 วัน:
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
ฉันคิดว่า "ค้นหาคน" เพิ่มเติมเล็กน้อยและกำลังมองหาพารามิเตอร์ -ctime / -atime เป็นต้นจะช่วยคุณที่นี่