พิจารณาใช้locate
คำสั่งที่เร็วกว่าfind
คำสั่ง
ทำงานกับข้อมูลการทดสอบ
$ sudo updatedb # necessary if files in focus were added `cron` daily.
$ printf "Number Files: " && locate -0r "$PWD.*\.c$" | xargs -0 -I{} sh -c 'test ! -L "$1" && echo "regular file"' _ {} | wc -l && printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -cu | wc -l
Number Files: 29
Number Dirs.: 7
ขอขอบคุณที่ Muru สำหรับคำตอบของเขาจะช่วยให้ฉันผ่านการลอกการเชื่อมโยงสัญลักษณ์จากจำนวนแฟ้มในUnix และ Linux คำตอบ
ขอบคุณ Terdon สำหรับคำตอบของเขา$PWD
(ไม่ใช่บอกที่ฉัน) ใน Unix และ Linux คำตอบ
คำตอบเดิมด้านล่างอ้างอิงโดยความคิดเห็น
แบบสั้น:
$ cd /
$ sudo updatedb
$ printf "Number Files: " && locate -cr "$PWD.*\.c$"
Number Files: 3523
$ printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Dirs.: 648
sudo updatedb
อัปเดตฐานข้อมูลที่ใช้โดยlocate
คำสั่งหาก.c
ไฟล์ถูกสร้างขึ้นในวันนี้หรือหากคุณลบไปแล้ว.c
ไฟล์วันนี้
locate -cr "$PWD.*\.c$"
ค้นหา.c
ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและเป็นลูก ( $PWD
) แทนที่จะพิมพ์ชื่อไฟล์และนับการพิมพ์ด้วย-c
อาร์กิวเมนต์ การr
ระบุ regex แทนการเริ่มต้น*pattern*
จับคู่ซึ่งสามารถให้ผลลัพธ์ที่มากเกินไป
locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
. ค้นหา*.c
ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและด้านล่าง ลบชื่อไฟล์โดยsed
ทิ้งชื่อไดเรกทอรีเท่านั้น นับจำนวนของไฟล์ในแต่ละ directory uniq -c
ใช้ wc -l
นับจำนวนของไดเรกทอรีที่มี
เริ่มต้นที่ไดเรกทอรีปัจจุบันด้วยหนึ่งซับ
$ cd /usr/src
$ printf "Number Files: " && locate -cr "$PWD.*\.c$" && printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Files: 3430
Number Dirs.: 624
สังเกตว่ามีการเปลี่ยนแปลงจำนวนไฟล์และจำนวนไดเรกทอรีอย่างไร ฉันเชื่อว่าผู้ใช้ทุกคนมี/usr/src
ไดเรกทอรีและสามารถเรียกใช้คำสั่งข้างต้นด้วยจำนวนที่แตกต่างกันขึ้นอยู่กับจำนวนของเมล็ดที่ติดตั้ง
แบบยาว:
รูปแบบที่ยาวรวมถึงเวลาเพื่อให้คุณสามารถดูวิธีการได้เร็วขึ้นมากเป็นมากกว่าlocate
find
แม้ว่าคุณจะมีการเรียกใช้ก็มีหลายครั้งที่เร็วกว่าที่เป็นหนึ่งเดียวsudo updatedb
find /
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ sudo time updatedb
0.58user 1.32system 0:03.94elapsed 48%CPU (0avgtext+0avgdata 7568maxresident)k
48inputs+131920outputs (1major+3562minor)pagefaults 0swaps
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Files: " && locate -cr $PWD".*\.c$")
Number Files: 3523
real 0m0.775s
user 0m0.766s
sys 0m0.012s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate -r $PWD".*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Dirs.: 648
real 0m0.778s
user 0m0.788s
sys 0m0.027s
───────────────────────────────────────────────────────────────────────────────────────────
หมายเหตุ:นี่คือไฟล์ทั้งหมดในไดรฟ์และพาร์ทิชันทั้งหมด เช่นเราสามารถค้นหาคำสั่งของ Windows ได้เช่นกัน:
$ time (printf "Number Files: " && locate *.exe -c)
Number Files: 6541
real 0m0.946s
user 0m0.761s
sys 0m0.060s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate *.exe | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Dirs.: 3394
real 0m0.942s
user 0m0.803s
sys 0m0.092s
ฉันมีพาร์ติชัน Windows 10 NTFS สามตัวที่เมาท์โดยอัตโนมัติ /etc/fstab
ติดตั้งโดยอัตโนมัติ ระวังตัวรู้รู้ทุกอย่าง!
จำนวนที่น่าสนใจ:
$ time (printf "Number Files: " && locate / -c && printf "Number Dirs.: " && locate / | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Files: 1637135
Number Dirs.: 286705
real 0m15.460s
user 0m13.471s
sys 0m2.786s
ใช้เวลา 15 วินาทีในการนับไฟล์ 1,637,135 ไฟล์ในไดเรกทอรี 286,705 YMMV
สำหรับรายละเอียดเกี่ยวกับlocate
การจัดการ regex ของคำสั่ง (ไม่จำเป็นต้องใช้ในคำถาม & คำตอบนี้ แต่ใช้ในกรณี) โปรดอ่านสิ่งนี้: ใช้ "ค้นหา" ภายใต้ไดเรกทอรีบางอย่าง?
อ่านเพิ่มเติมจากบทความล่าสุด: