จะแสดงรายการไฟล์ที่เก่ากว่าวันด้วย“ 2015” ในชื่อไฟล์ได้อย่างไร


11

ฉันต้องการแสดงรายการล็อกไฟล์ทั้งหมดที่ไม่ได้เป็นของวันนี้และมีเฉพาะไฟล์ที่มี2015อยู่ในชื่อ

นี่คือคำสั่งที่ฉันได้ลอง:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

เอาต์พุตจากทั้งสองอย่างนั้นคืออะไร แต่ก็ยังมีไฟล์อยู่ มีบางอย่างผิดปกติกับคำสั่งเหล่านี้และฉันไม่ได้รับอะไร ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


findส่วนหนึ่งที่ดูดีให้ฉัน แต่ฉันยังมีปัญหากับ-execพารามิเตอร์ ฉันไม่สามารถทำงานได้เช่นกัน (ฉันพยายามย้ายไฟล์ jpg ทั้งหมดจากโฟลเดอร์หนึ่งไปยังไดเรกทอรีหลักผ่าน - และสิ้นสุดการดำเนินการด้วยตนเอง ... )
ผู้บัญชาการ Byte


@steeldriver ฉันคิดว่ามันเป็นสิ่งที่ผิดปกติที่นี่เพราะหากมีไฟล์ในไดเรกทอรีปัจจุบันที่มี2015ชื่อ (ข้อบกพร่องอื่น ๆ ที่ชัดเจนของวิธีการเขียนคำสั่ง) ฉันสงสัยว่าจะมีผลลัพธ์บางชนิด ดังนั้นคุณอาจต้องการโพสต์คำตอบเกี่ยวกับเรื่องนั้น
Eliah Kagan

คำตอบ:


18

คำสั่งfind . -name '*2015*' -mmin +1440 -lsอาจจะทำสิ่งที่คุณต้องการ ดูรายละเอียดด้านล่าง

-name 2015คำสั่งแรกของคุณได้ มันไม่ทำงานเพราะจะค้นหาเฉพาะไฟล์ที่มีชื่อตรง 2015กับตัวอักษรอื่น ๆ

คำสั่งที่สองของคุณfind . -name *2015* -mtime +1 -exec ls -ltrh {} \;อาจล้มเหลวด้วยเหตุผลสองประการ:

1. unquoted *ตัวอักษรมีการขยายตัวเปลือกแล้วfindส่งต่อไปยัง

หากมีไฟล์ใด ๆ ที่มีอยู่ในไดเรกทอรีปัจจุบันโดยตรง (ไฟล์ที่คุณอยู่เมื่อคุณรันfind ...คำสั่งนั้น) ซึ่งชื่อมี2015(และไม่ได้ขึ้นต้นด้วย.) เชลล์จะขยาย*2015*เข้าไปในรายการของชื่อไฟล์เหล่านั้นจากนั้นส่งผ่าน findรายการที่เป็นข้อโต้แย้งที่จะ นี่ไม่ใช่สิ่งที่คุณต้องการ - แทนคุณต้องการผ่าน*2015*ตัวอักษรเพื่อหาอาร์กิวเมนต์ดังนั้นfindและไม่ใช่เชลล์ที่สามารถค้นหาไฟล์ที่ตรงกับมัน

*2015*เพื่อแก้ไขปัญหาที่อ้าง มีสามวิธีทั่วไปในการทำ:

  • '*2015*'(เช่นfind . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;)
  • "*2015*"(เช่นfind . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;)
  • \*2015\*(เช่นfind . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;)

ฉันขอแนะนำให้เขียนด้วยเครื่องหมายคำพูดเดียว'*2015*'เพราะ:

แต่ในกรณีนี้มันไม่สำคัญ 'และ"ทั้งคู่ปฏิบัติ*เช่นเดียวกันและการแสดงออกไม่ซับซ้อนพอที่จะ\อ้างถึงเพื่อให้เข้าใจได้ยาก

2. -mtime +1เลือกเฉพาะไฟล์ที่แก้ไขตั้งแต่สองวันขึ้นไป

ตามที่man findพูดว่า:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

สมมติว่าไฟล์มีการแก้ไข 47 ชั่วโมงที่ผ่านมา หากต้องการทราบว่ามีรอบระยะเวลา 24 ชั่วโมงเท่าใดให้findปัดเศษลง : เป็นหนึ่งช่วงเวลา 24 ชั่วโมงที่ผ่านมา แต่จะ-mtime +1จับคู่เฉพาะไฟล์ที่เวลาการแก้ไขมากกว่าหนึ่งช่วงเวลา 24 ชั่วโมงที่ผ่านมาอย่างเคร่งครัด ดังนั้นไฟล์จากเมื่อวานจะไม่ถูกจับคู่

ดูเหตุใด -mtime +1 จึงส่งคืนไฟล์ที่เก่ากว่า 2 วันเท่านั้น สำหรับข้อมูลเพิ่มเติมตามที่แนะนำโดย steeldriver

หากต้องการค้นหาไฟล์ที่แก้ไขล่าสุดเมื่อเวลากว่า 24 ชั่วโมงที่ผ่านมาฉันขอแนะนำให้กำหนดเป็น1440 นาทีที่แล้วด้วย-mmin +1440:

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

{}ผู้อ่านบางคนอาจสงสัยว่าทำไมผมไม่ได้พูด บางคนพูด{}เพื่อเตือนให้มนุษย์ว่ามันไม่ใช่การแสดงออกสำหรับการขยายตัวรั้ง กระสุนสไตล์บอร์น (เช่นทุบตี ) ไม่จำเป็นต้อง{}อ้างถึงภายใน บางทีกระสุนที่ไม่ใช่สไตล์บอร์นบางตัวอาจทำแบบพิเศษ นั่นอาจเป็นสาเหตุที่ผู้ใช้บางคนพูดถึงมัน แต่ยังมีความเข้าใจผิดที่บางครั้งต้องอ้าง{}เพื่อ-execจัดการชื่อไฟล์ด้วยช่องว่างอย่างถูกต้อง ที่มิ s เท็จด้วย{}หรือ'{}', findได้รับเดียวกันข้อโต้แย้งเช่นเปลือกเอาคำพูดก่อนที่จะผ่าน'{}'ไปfind. เพื่อตอบโต้ความเข้าใจผิดนี้ฉันไม่ได้อ้าง{}ถึง แต่เป็นเรื่องของสไตล์ - หากคุณต้องการ{}บันทึกว่าเชลล์ไม่ได้รับการดูแล{และ}เป็นพิเศษอย่างไร

ผมขอแนะนำให้คุณทั้งเปลี่ยนlsคำสั่งหรือ (ตามMuru ได้แนะนำ ) แทนที่ด้วยfindของ-lsการกระทำ ls -ltrhอาจไม่ได้ทำสิ่งที่คุณตั้งใจเพราะมันจะทำงานแยกต่างหากสำหรับแต่ละไฟล์ที่พบและทำให้-tและ-rธงซึ่งระบุการเรียงลำดับไม่เกี่ยวข้อง

แม้ว่าเอาต์พุตจะได้รับการจัดรูปแบบแตกต่างไปจากนี้เล็กน้อยการls -lใช้งาน-lsนั้นง่ายกว่าและง่ายกว่า

find . -name '*2015*' -mmin +1440 -ls

หรือหากคุณตัดสินใจว่าจะต้องแสดงรายชื่อไฟล์ (รวมถึงพา ธ ของไฟล์เหล่านั้นด้วย.) คุณสามารถระบุว่าไม่มีการดำเนินการใด ๆ ซึ่งเป็นสาเหตุให้มี-printการใช้งานเริ่มต้น:

find . -name '*2015*' -mmin +1440

1
คำตอบอย่างละเอียดดี! อย่างน้อยเมื่อ GNU พบว่ายังมีnewerXYไวยากรณ์ซึ่งยอมรับอาร์กิวเมนต์ของปฏิทินเช่น-newermt 'yesterday'และ! -newermt 'yesterday'
steeldriver

คุณรู้อะไรไหม ? คุณจะน่ากลัว @ Eliah Kagan.
rɑːdʒɑ

ขอบคุณไดรเวอร์ stell นั่นเป็นข้อมูลที่ดีมากจากลิงก์ที่น่ารู้ แต่ในกรณีของฉันมันเป็นบันทึกของแอปพลิเคชันจากไฟล์เก่าของแอปพลิเคชันไม่สามารถแก้ไขได้ ขอขอบคุณอีกครั้ง
r 8dʒɑ

2

อ้างอิงการแสดงออกและฉันขอแนะนำให้คุณพูดวงเล็บเช่นกัน

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

หรือ

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

คุณไม่จำเป็นต้องส่งไฟล์ที่คุณค้นหาไปยัง ls

find . -name "*2015*" -mtime +1

อาจจะ จำกัด การใช้-type f? และหากจะต้องมีการใช้แนะนำให้ใช้ls -ls
muru

1
แน่นอนคำแนะนำที่ดีทั้งหมด ฉันไม่แน่ใจว่า OP ต้องการอะไรและฉันเชื่อว่าสาเหตุของปัญหาคือการขาดเครื่องหมายคำพูดในรูปแบบการค้นหา "-name"
Panther

2

ในzshคุณสามารถใช้ตัวระบุแบบกลม (นี่เป็นคุณสมบัติ zsh ที่ไม่ซ้ำกันซึ่งไม่สามารถใช้ได้ในเชลล์อื่นเช่นทุบตี)

ls -ltr *2015*(m+1)

นี่จะแสดงรายการไฟล์ในไดเรกทอรีปัจจุบันเท่านั้น เพื่อสำรวจไดเรกทอรีซ้ำใช้

ls -ltr **/*2015*(m+1)

ด้วยfind, -name 2015เพียง 2015แต่พบชื่อไฟล์ที่มีอยู่ตรง -name *2015*ใช้ได้เฉพาะในกรณีที่ไม่มีไฟล์ที่มีชื่อ2015อยู่ในไดเรกทอรีปัจจุบันเนื่องจากเชลล์ขยายรูปแบบ*2015*ก่อนที่จะfindถูกเรียกใช้ คุณต้องพูดรูปแบบ:

find -name '*2015*' -mtime +1 …

โปรดทราบว่าทั้งสองfind -mtime +1และ zsh *(m+1)ค้นหาไฟล์ที่มีอายุอย่างน้อย 48 ชั่วโมงไม่ใช่ไฟล์ที่เก่ากว่าวันนี้ เครื่องหมายบวกหมายถึง“ เคร่งครัดมากกว่า” และจำนวนวันจะถูกปัดเศษลง เพื่อหาไฟล์ที่มีอย่างน้อย 24 ชั่วโมงอายุการใช้งานหรือ-mtime +0(m+0)

หากคุณต้องการที่จะหาไฟล์ที่ถูกแก้ไขครั้งล่าสุดเมื่อวานนี้หรือก่อนคุณสามารถใช้findกับ-newermtคำกริยา :

find -name '*2015*' ! -newermt 'today 0:00' …

ไม่มีวิธีที่สะดวกมากที่จะทำการทดสอบนี้ใน zsh

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