ค้นหาชื่อไฟล์ที่ไม่มีสตริงที่ระบุ


19

ฉันต้องการดำเนินการตรงข้ามกับ:

find . -name "*2013*"

ค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่ไม่มีสตริง "2013" ในชื่อ ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


28

เพียง:

find . ! -name '*2013*'

เพิ่ม a ! -type dเพื่อแยกไฟล์ของไดเรกทอรีประเภท(เช่น.ตัวเอง) หรือ-type fรวมไฟล์ปกติเท่านั้นไม่รวมไฟล์ประเภทอื่น ๆ (ไดเรกทอรี, fifos, symlink, อุปกรณ์, ซ็อกเก็ต ... )

ระวัง แต่ที่*ตรงกับลำดับของ 0 หรือมากกว่าตัวอักษร ดังนั้นจึงสามารถรายงานชื่อไฟล์ที่มี2013หาก2013ถูกนำหน้าหรือตามด้วยสิ่งที่ไม่สามารถถอดรหัสได้อย่างสมบูรณ์เป็นอักขระที่ถูกต้องในสถานที่ปัจจุบัน

ซึ่งอาจเกิดขึ้นได้หากคุณอยู่ในสถานที่ที่อักขระสามารถเข้ารหัสได้มากกว่าหนึ่งไบต์ (เช่นใน UTF-8) สำหรับชื่อไฟล์ที่เข้ารหัสในการเข้ารหัสที่แตกต่างกัน ตัวอย่างเช่นในโลแคล UTF-8 มันจะรายงานStéphane2013ไฟล์หากéมีการเข้ารหัสในชุดอักขระ iso8859-15 (เป็น 0xe9 ไบต์)

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

LC_ALL=C find . ! -name '*2013*'

4

รูปแบบชื่อไฟล์ Ksh นั้นเพียงพอ:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

การอ้างอิง

หากเชลล์ของคุณทุบตีคุณต้องรันshopt -s extglobก่อนจึงจะสามารถใช้รูปแบบนี้ได้ (คุณสามารถใส่ไว้ใน.bashrc) หากเชลล์ของคุณคือ zsh คุณต้องเรียกใช้setopt ksh_glob(คุณสามารถใส่ไว้ในของคุณ.zshrc) zsh ยังข้อเสนอซึ่งจะต้องเบื้องต้นls -d -- ^*2013*setopt extended_glob

ขึ้นอยู่กับสิ่งที่คุณทำกับชื่อไฟล์เหล่านี้lsอาจไม่ใช่คำสั่งที่ถูกต้องที่จะใช้ เพื่อเก็บไว้ในอาเรย์

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
แต่นั่นไม่ได้รับการชดเชยในไดเรกทอรีย่อยและจะข้ามไฟล์ dot (และlsจะส่งคืนข้อความแสดงข้อผิดพลาดหากรูปแบบไม่ตรงกับไฟล์ใด ๆ ) ยังทราบว่าkshจะเรียงลำดับรายการ
Stéphane Chazelas

-1

ค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่ไม่มีสตริงที่แน่นอนที่นี่ "2013":

find . ! -name "*2013*" -type f

2
นี่คือสิ่งเดียวกับunix.stackexchange.com/a/102614/117549จาก 3 ปีก่อนยกเว้นคุณได้เพิ่ม "-f" ซึ่งทำให้คำตอบแย่ลง
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.