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