จะใช้ 'ค้นหา' เพื่อค้นหาไฟล์ที่สร้างในวันที่ระบุได้อย่างไร [ปิด]


254

ฉันจะใช้คำสั่ง UNIX findเพื่อค้นหาไฟล์ที่สร้างในวันที่ระบุได้อย่างไร


8
ดูเหมือนว่าอนุญาตให้ใช้คำถามการสคริปต์ทุบตี
อลัน

@MichaelScheper: ฉันไม่รู้ด้วยซ้ำว่าจะเริ่มต้นกับความคิดเห็นนั้นได้อย่างไร
การแข่งขัน Lightness ใน Orbit

1
@Notinlist: นี่คือคำตอบ: meta.stackexchange.com/questions/10249/…น่าเสียดายที่การ จำกัด เวลาหมดอายุแล้ว น่าเสียดายที่การค้นหาเว็บยังคงอยู่ที่นี่และคำตอบที่ได้รับการยอมรับมีประโยชน์สำหรับผู้คนจำนวนมาก
Michael Scheper

@MichaelScheper: หากคุณสามารถหาตัวเลือกในการลงคะแนนเพื่อโยกย้ายไปยัง unix.stackexchange.com โดยทั้งหมดชี้ให้ฉันเห็น เนื่องจากคุณไม่มีตัวแทนที่จะเห็นบทสนทนาใกล้ชิดฉันจะให้คำแนะนำ: ไม่มี พิจารณาการต่อสู้น้อยลงเมื่อคุณไม่รู้ว่าคุณกำลังพูดถึงอะไร ขอบคุณสำหรับความสนใจ.
การแข่งขัน Lightness ใน Orbit

5
@LightnessRacesinOrbit: ฉันขอโทษที่เจอว่าเป็น 'ต่อสู้' ฉันไม่ได้รับอนุญาตให้แก้ไขความคิดเห็นของฉัน แต่สำหรับการอ้างอิงในอนาคตความคิดเห็นของฉันคือการชมคำถามที่ทำให้คุณขุ่นเคืองหรือไม่? ฉันต้องบอกว่าฉันรู้สึกไม่ดีเลยแม้แต่น้อยหลังจากที่คุณแสดงความคิดเห็นก่อนหน้านี้ถึงประโยชน์ของความสงสัย จริง ๆ แล้วฉันพยายามที่จะสร้างสรรค์มากกว่าการเพิ่ม 'me เกินไป' อีกด้วยโดยดูว่าการโยกย้ายทำงานอย่างไร: meta.stackexchange.com/a/10250/249555การ จำกัด เวลา 60 วันซ่อนตัวเลือกนั้นอาจจะ? ขออภัยสำหรับกุ๊ยคัดท้าย ขอบคุณอีกครั้ง - จริงใจ - สำหรับเวลาและความสนใจของคุณ
Michael Scheper

คำตอบ:


323

ตามที่ 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' ตามปกติจะตรงกับวันที่สร้างแม้ว่า


7
เวอร์ชันค้นหาของฉัน (GNU 4.2.32) ดูเหมือนจะไม่สนับสนุนเพรดิเคต -newerXY จำเป็นต้องมีเวอร์ชันขั้นต่ำเป็นพิเศษหรือไม่? หรือเป็นกรณีของการรวบรวมการค้นหาด้วยสวิตช์กำหนดค่าพิเศษหรือไม่?
yukondude

1
@ yukondude: ถูกต้อง เวอร์ชันของ find ฉันมีในเครื่อง - GNU 4.4.0 - มีอยู่ในขณะที่ 4.1.20 ที่ฉันมีใน Dreamhost ไม่มี kludge ที่มีการสร้างสองไฟล์ควรทำงานด้วยเช่นกัน
Arve

1
ในบางระบบ (FreeBSD, OS / X ... ) -newerBtจะจับคู่กับเวลาเกิด (การสร้าง) ของไฟล์
Stephane Chazelas

3
โปรดทราบว่า-newerxtมีอยู่ในFreeBSDตั้งแต่ปี 2001 (ที่มันถูกจัดให้เป็นครั้งแรกเป็นแพทช์ในปี 1998) ไม่กี่ BSDs อื่น ๆ และ GNU หา (ตั้งแต่ 4.3.3 ในปี 2007) บนพื้นฐานของ HP / UX พบซึ่งแนะนำ-newerXY( แต่ที่ Y == t ไม่รองรับ)
Stephane Chazelas

การใช้: find (GNU findutils) 4.4.0 ไวยากรณ์นี้ใช้ไม่ได้กับ SUSE ext3 ถ้ามันควรจะลิสต์ไฟล์ / w mtime ในวันนั้นมันจะไม่ส่งคืนอะไรเลย
niken

68

find location -ctime time_period

ตัวอย่างของ time_period:

  • มากกว่า 30 วันที่ผ่านมา: -ctime +30

  • น้อยกว่า 30 วันที่ผ่านมา: -ctime -30

  • ตรง 30 วันที่ผ่านมา: -ctime 30


7
ปัญหาคือฉันต้องการทดสอบวันที่ระบุไม่ใช่ภายในช่วงเวลาหนึ่ง
sverrejoh

1
ลองคิดดูว่ากี่วันที่แล้วเป็นเท่าไหร่และใช้ตัวเลขนั้น
jmanning2k

15
ctimeไม่มีอะไรเกี่ยวข้องกับเวลาการสร้างมันเป็นเวลาเปลี่ยน inode
Stephane Chazelas

47

มันเป็นสองขั้นตอน แต่ฉันชอบที่จะทำอย่างนี้:

สร้างไฟล์ด้วยวันที่ / เวลาที่ต้องการก่อน ในกรณีนี้ไฟล์คือ 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

3
+1 สำหรับการแก้ปัญหาสำหรับผู้สูงอายุfindที่ขาด-newerXY
Felipe Alvarez

1
IMO ตอนนี้ควรเป็นทางออกที่ยอมรับ ฉันไม่สามารถเรียกใช้ -newermt บนเคอร์เนล 2.6.18-348.18.1.el5 ให้ใหม่กว่านี้ได้
DarkForce

เช่นเดียวกันที่นี่ DarkForce ฟังก์ชั่นการทำงานใหม่ดูเหมือนจะไร้ความหมายมาก
niken

34

คุณสามารถทำได้:

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

นี่คือสิ่งที่คนส่วนใหญ่ต้องการ แต่มันไม่ได้รับ upvotes มากพอ !!!
sjas

2
สิ่งนี้อาจใช้ไม่ได้กับการมีไฟล์กี่ล้านไฟล์ในหนึ่งไดเรกทอรี
Dennis Nolte

3
มีผลข้างเคียงหากคำค้นหา grep อยู่ในชื่อไฟล์
Snorex

mywiki.wooledge.org/ParsingLs - วิธีการที่ดีน่าจะเป็นในการพิมพ์วันที่สร้างในรูปแบบที่เครื่องสามารถอ่านอาจจะมีถ้าคุณไม่ได้มีstat find -printf
tripleee

12

คุณทำไม่ได้ สวิตช์ -c จะบอกคุณเมื่อสิทธิ์ถูกเปลี่ยนแปลงครั้งล่าสุด -a ทดสอบเวลาเข้าถึงล่าสุดและ -m ทดสอบเวลาแก้ไข ระบบไฟล์ที่ใช้โดย Linux ส่วนใหญ่ (ext3) ไม่รองรับการบันทึก "การสร้างเวลา" ขออภัย!


7
ที่จริงแล้วมันไม่ได้เป็นเพียงแค่ระบบไฟล์เท่านั้น - ไม่มีระบบเชื่อมต่อเพื่อรับข้อมูลดังกล่าวแม้ว่าระบบไฟล์จะเก็บไว้ หนึ่งในข้อบกพร่องของ Unix คือการย้อนกลับไปสู่ยุคแรกสุดซึ่งเป็นสาเหตุที่ Unix จะไม่มีวันหยุด
chrisdowney

1
ยูนิกซ์จะไม่ถอด
lucid_dreamer

8

@ 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: คำตอบ


2

ด้วยสวิตช์ -atime -ctime และ -mtime เพื่อค้นหาคุณสามารถเข้าใกล้สิ่งที่คุณต้องการได้


-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

1
ทำไมคุณคัดลอกไฟล์? นอกเหนือจากคำสั่งในการ`ls ...`ทำงานมันไม่ได้ใช้findเครื่องมือ
Yamaneko

-5

ฉันพบสคริปเล็ตนี้ในสคริปต์ที่ลบไฟล์ทั้งหมดที่เก่ากว่า 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 เป็นต้นจะช่วยคุณที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.