POSIX มีสิ่งนี้จะพูดเกี่ยวกับวันที่ในls -lรายชื่อ ong:
<date and time>ฟิลด์ต้องมีวันที่และเวลาที่เหมาะสมเมื่อไฟล์ถูกแก้ไขล่าสุด ในโลแคล POSIX ฟิลด์จะเทียบเท่ากับเอาต์พุตของคำสั่ง date ต่อไปนี้:
date "+%b %e %H:%M"
... หากไฟล์ถูกแก้ไขในช่วงหกเดือนที่ผ่านมาหรือ:
date "+%b %e %Y"
การพิจารณาเรื่องนี้และเพื่อให้แน่ใจว่าหากมีบรรทัดใหม่ในชื่อไฟล์พวกเขาจะกลมกลืนกับls -qตัวเลือกPOSIX ที่ระบุอย่างเหมาะสมมันค่อนข้างง่ายในการจัดเตรียม regex สำหรับlsผลลัพธ์โดยfindที่ไม่ต้องทำอะไรเลย:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grepสำหรับสิ่งนั้นและคุณจะส่งคืนเฉพาะบรรทัดที่มีสตริงที่แสดงวันที่วันนี้หรือเมื่อวาน คำสั่งต่อไปนี้เพิ่มไปเล็กน้อย:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls ตัวเลือกประกอบด้วย:
-a ส่งคืนไฟล์ทั้งหมดในไดเรกทอรีรวมถึงไฟล์ที่ขึ้นต้นด้วย .dot
-l รายชื่อยาว
-R รายการไดเรกทอรีลูกทั้งหมดซ้ำ
-c แสดงเวลาแก้ไขมากกว่าเวลาเข้าถึง
-qส่งคืนเชลล์ glob ?แทนที่จะเป็นอักขระที่ไม่สามารถพิมพ์ได้หรือ\tab ในชื่อไฟล์
ผลลัพธ์เหล่านั้นจะถูกส่งผ่าน|pipeไฟล์sedที่ตรงเท่านั้น:
- บรรทัดว่างนำหน้าชื่อพา ธ และบรรทัดต่อไปนี้
- บรรทัดที่ขึ้นต้นด้วย
- (ในคำอื่น ๆ - ไม่ใช่dสำหรับไดเรกทอรี)ที่มีของคุณด้วยdateด้วย
- มันไม่ได้พิมพ์บรรทัดชื่อพา ธ แม้ว่าจะไม่มีไดเรกทอรีที่พวกเขาตั้งชื่อไฟล์ที่คุณกรองไว้
ผลลัพธ์มีลักษณะดังนี้:
ls -alRcq --color=always |
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv 2086 Jul 4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv 2657 Jul 4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv 681 Jul 5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul 5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul 4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul 4 13:34 shot-2014-06-22_17-11-06.jpg
./.cache/efreet:
-rw------- 1 mikeserv mikeserv 37325 Jul 4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv 37325 Jul 4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 16037 Jul 4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv 3117 Jul 4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul 4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv 18589 Jul 4 23:30 icons_hicolor_localhost.eet
./.config:
-rw-r--r-- 1 mikeserv mikeserv 30 Jul 4 19:10 pavucontrol.ini
./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul 4 13:36 conf.tar.lz4.bak
ใช่มันใช้งานได้กับLS_COLORS- ซึ่งอาจเป็นลำดับความสำคัญต่ำสำหรับcronหลักสูตรของคุณแต่เฮ้ตัวเลือกของคุณเปิดอยู่
ไม่ว่าในกรณีใด ๆ ข้อเสนอนี้มีข้อได้เปรียบที่สำคัญกว่าโซลูชันที่เป็นไปได้อื่น ๆ
ในสถานที่แรกfind+ lsเกี่ยวข้องกับการร้องขอหลายรายการ - นี่เกี่ยวข้องกับlsกระบวนการเดียวเท่านั้นและนี่คือสาเหตุที่มันสามารถจัดเรียงทุกอย่างได้อย่างน่าเชื่อถือ - ซึ่งเป็นค่าเริ่มต้น - และsortเป็นสิ่งเสริมด้วยเช่นกัน
การแก้ปัญหาใด ๆ ที่เกี่ยวข้องfindและsortและlsการทำงานทั้งหมดสองครั้ง lsและfindทั้งคู่จะแก้ไขชื่อพา ธ และstatทุกไฟล์ lsและsortจะจัดเรียงผลลัพธ์ทั้งหมด lsมันอาจจะดีที่สุดคือแทนที่จะใช้เพียงครั้งเดียว
แน่นอนว่ามันมีdateและsedบางส่วนของคำตอบนี้ สิ่งสำคัญที่ควรทราบคือคุณทำส่วนที่ยากและรับ regex ก่อน - และเพียงครั้งเดียว - หลังจากนั้นคุณจะตัดรายการผลลัพธ์เพียงรายการเดียวแทนที่จะพูดว่ารับผลลัพธ์รับผลลัพธ์จัดเรียงผลลัพธ์และเรียงลำดับผลลัพธ์
สิ่งนี้จะไม่ทำลายชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่เนื่องจากโซลูชันอื่น ๆ น่าจะเป็น วิธีการแก้ปัญหานี้มีคำเตือนของตัวเอง - ซึ่งฉันจะอธิบายต่อไป - แต่พวกเขาก็มีนาทีและจัดการได้อย่างง่ายดาย ในความคิดของฉันนี่เป็นทางออกที่แข็งแกร่งที่สุดที่นี่
มีสองกรณีที่คำสั่งดังกล่าวอาจทำให้คุณมีปัญหา ครั้งแรกที่เกี่ยวข้องกับ?globs ในชื่อไฟล์ - ในขณะที่มันเป็นวิธีการแก้ปัญหาที่มีประสิทธิภาพมากขึ้นกว่าที่เสนออื่น ๆ ที่นี่และโอกาสที่คุณจะพบ a ?ทั้งหมดมีขนาดเล็กพอในตัวเองมีความเป็นไปได้ที่จะแก้ไข globs เหล่านั้น สามารถจับคู่ชื่อไฟล์ได้มากกว่าหนึ่งชื่อ โปรดดูสิ่งนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
ความเป็นไปได้อื่น ๆ นั้นเกี่ยวข้องกับผลบวกที่ผิดพลาด - ตัวอย่างเช่นหากคุณมีชื่อไฟล์ที่ตรงกับdateสตริงที่เรากำลังค้นหาgrepแต่ที่ไม่ได้แก้ไขจริงในวันใดวันหนึ่ง ฉันไม่ได้นับว่าเป็นปัญหา แต่ถ้าเป็นเช่นนั้นถามเกี่ยวกับมันและฉันอาจช่วยให้คุณสร้าง regex ที่เฉพาะเจาะจงมากขึ้นเพื่อจัดการกับเรื่องนี้
ls -ls **/*(.)