รายการไฟล์ไม่ตรงกับสตริงที่กำหนดในชื่อไฟล์


16

ฉันมีไดเรกทอรีที่มีไฟล์จำนวนมาก (ประมาณ 200) ที่มีชื่อtemp_log.$$ถูกสร้างขึ้นด้วยไฟล์สำคัญอื่น ๆ ที่ฉันต้องตรวจสอบ

ฉันจะแสดงรายการไฟล์ทั้งหมดและแยกtemp_log.$$ไฟล์ไม่ให้แสดงได้อย่างง่ายดายได้อย่างไร

ผลลัพธ์ที่คาดหวัง

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

ฉันอ่านlsหน้าคนแล้ว แต่ไม่พบสิ่งใดในเอกสารอ้างอิงนี้ โปรดแจ้งให้เราทราบหากฉันพลาดข้อมูลสำคัญใด ๆ ที่นี่

ขอบคุณ


ใน BASH ls --hide='temp_log.$$'ควรทำงาน คุณสามารถ / ควรขยายนี้กับสัญลักษณ์ขึ้นซึ่งเป็นส่วนหนึ่งของคำทั้งtemp_log.$$เป็น
erch

คำตอบ:


25

ด้วย GNU ls(รุ่นที่ไม่ใช่ Embedded Linux และ Cygwin บางครั้งพบที่อื่น) คุณสามารถยกเว้นบางไฟล์เมื่อแสดงรายการไดเรกทอรี

ls -I 'temp_log.*' -lrt

(หมายเหตุรูปแบบยาวของ-Iคือ--ignore='temp_log.*')

ด้วย zsh คุณสามารถปล่อยให้เชลล์ทำการกรองได้ ผ่าน-dไปlsเพื่อหลีกเลี่ยงรายการเนื้อหาของไดเรกทอรีที่ตรงกัน

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

ด้วย ksh, bash หรือ zsh คุณสามารถใช้ไวยากรณ์การกรอง ksh ใน zsh ให้รันsetopt ksh_globก่อน ใน bash ให้รันshopt -s extglobก่อน

ls -dltr !(temp_log.*)

โปรดอย่าอ้างคำพูดเดียวในตัวอย่างสำหรับ GNU ls: ls -I 'temp_log. *' -lrt พวกเขาจำเป็นต้องส่งรูปแบบไปยังคำสั่งและไม่ปล่อยให้เชลล์ขยายออก
shargors

บน Ubuntu ทุบตี v4.3.48 มันควรจะ-Itemp_log.*ไม่มีที่ว่างหลังจาก-I
Yan King Yin

1
@YanKingYin -Iไม่มีก็ปรับให้มีพื้นที่หลังจากที่ อย่างไรก็ตาม*ความต้องการที่จะเสนอราคาไม่ทางใดก็ทางหนึ่ง -I temp_log.*ไม่ได้ทำงาน แต่-I 'temp_log.*', -I "temp_log.*", -I temp_log.\*ฯลฯ จะมีการปรับ
Gilles 'หยุดความชั่วร้าย' ใน

10

คุณสามารถใช้กับตัวเลือกgrep-v

ls -lrt | grep -v <exclude-filename-part>

1
ไม่แน่ใจว่าทำไมสิ่งนี้จึงถูก downvote เป็นคำตอบที่ถูกต้อง
Tim Kennedy

5
การทำ grep บนเอาต์พุต ls ไม่ถูกต้องเสมอไปและไม่แนะนำ มันมีผลข้างเคียง ไม่สามารถเรียกคืนปัญหาที่แน่นอนได้ ข้อความข้าง - โหวตลงไม่ได้มาจากฉัน;)
mtk

1
นี่คือการเชื่อมโยงกับการที่ว่าทำไมการแยก LS เป็นความคิดที่ไม่ดี
mtk

3

คุณสามารถใช้findสิ่งนี้:

find . \! -name 'temp_log*'

สิ่งนี้จะพิมพ์ชื่อคุณสามารถเพิ่ม-lsเพื่อสร้างls -lสไตล์เอาท์พุทด้วยการประทับเวลาและการอนุญาตหรือใช้-exec ls {} +เพื่อส่งผ่านไปยัง ls ด้วยตัวเลือกอะไรก็ได้ที่คุณต้องการสำหรับคอลัมน์การเรียงลำดับ ฯลฯ

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

find . \! -name 'temp_log*' -maxdepth 1

และถ้าคุณใช้ ls คุณจะต้องผ่านตัวเลือก -d เพื่อหยุดมันจากการแสดงรายการภายในไดเรกทอรี:-exec ls -d {} +


อาจต้องการเช่นกันที่จะเลียนแบบไม่ใช่-maxdepth 1 recursive ls
jw013

ดี ผู้ใช้ที่มี POSIX น้อยมากขึ้นfindโดยไม่ควรดูที่นี่-maxdepth
สัญลักษณ์แทน

2

lsฉันคิดว่าคุณต้องการที่จะใช้คุณลักษณะของเปลือกไม่ man bashผมใช้ทุบตีดังนั้นฉันจะตรวจสอบสิ่งที่คุณต้องการใน ค้นหา "^ EXPANSION", (โดยกดปุ่มแรก '/') ข้อความที่ตัดตอนมา:

การขยาย

    การขยายจะดำเนินการในบรรทัดคำสั่งหลังจากที่มันถูกแบ่งออกเป็นคำ มีหลายชนิดที่เจ็ดของการขยายตัวจะดำเนินการ: การขยายตัวรั้ง , ตัวหนอนขยายตัว , พารามิเตอร์และการขยายตัวตัวแปร , แทนคำสั่ง , การขยายตัวทางคณิตศาสตร์ , แยกคำและการขยายตัวของพา

   ︙
... <snip> ...
   ︙

การขยายชื่อพา ธ

    หลังจากแยกคำเว้นแต่-fตัวเลือกที่ได้รับการตั้งค่าทุบตีสแกนแต่ละคำสำหรับตัวละคร*, และ? [หากหนึ่งในอักขระเหล่านี้ปรากฏขึ้นคำนั้นจะถือเป็นรูปแบบและแทนที่ด้วยรายการที่เรียงลำดับตามตัวอักษรของชื่อไฟล์ที่ตรงกับรูปแบบ ...

ฉันเพิ่งเริ่มแยกไฟล์ตามตัวอักษรตัวแรกของพวกเขาด้วยคำสั่งเช่น:

$ ls ./[^t]*

tนี้จะตรงกับสิ่งที่ไม่ได้เริ่มต้นด้วยตัวอักษร หากคุณเพิ่มอักขระระหว่างวงเล็บคุณจะแยกไฟล์ที่ขึ้นต้นด้วยตัวอักษรเหล่านั้นด้วย

กำลังมองหาลิงค์และฉันเป็นคนดี! ดูรูปแบบการจับคู่ จากตรงนี้จะใช้งานได้กับกรณีของคุณ:

$ ls -lrt ./!(temp_log.*)

นี้ต้องการให้มีextglobตัวเลือกเปลือกถูกเปิดใช้งานโดยใช้shoptbuiltin ( shopt -s extglob) ตามที่ระบุไว้โดยกิลส์



-2

เนื่องจากไฟล์ที่คุณไม่ต้องการพิมพ์มี "temp_log" ในชื่อไฟล์แล้วกรองด้วย grep:

ls -lrt | grep -v "temp_log."

หมายเหตุ: โพสต์อื่นที่มีคำตอบคล้ายกันอาจถูกลดระดับลงเนื่องจากผู้ใช้ไม่ได้ใส่เครื่องหมายอัญประกาศ "" รอบ ๆ สตริงที่ grep ควรมองหา หากไม่มีเครื่องหมายคำพูดจะไม่ทำงานตามที่โฆษณาไว้


'NOTE' ของคุณไม่ถูกต้องอย่างเคร่งครัด มีอักขระบางตัวที่อาจต้องอ้างถึง แต่ฉันไม่คิดว่าจะมีข้อความใดในสตริงนั้น
smokes2345

จนกว่าจะมีผู้ใช้หรือกลุ่มชื่อ "temp_log" (จุดใน regex จะจับคู่กับช่องว่างหรืออะไรก็ตามที่ตามtemp_logมานี่ไม่ใช่วิธีที่ดี (ทั่วไป) ในการยกเว้นlsผลลัพธ์
Jeff Schaller

เฉพาะที่มี-F@ smokes2345; ช่วงเวลาจะตรงกับตัวละครใด ๆ ในการแสดงออกปกติขั้นพื้นฐาน ดู: unix.stackexchange.com/q/119905/117549
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.