ฉันต้องการดำเนินการตรงข้ามกับ:
find . -name "*2013*"
ค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่ไม่มีสตริง "2013" ในชื่อ ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันต้องการดำเนินการตรงข้ามกับ:
find . -name "*2013*"
ค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่ไม่มีสตริง "2013" ในชื่อ ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
เพียง:
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*'
รูปแบบชื่อไฟล์ 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
ค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่ไม่มีสตริงที่แน่นอนที่นี่ "2013":
find . ! -name "*2013*" -type f
ls
จะส่งคืนข้อความแสดงข้อผิดพลาดหากรูปแบบไม่ตรงกับไฟล์ใด ๆ ) ยังทราบว่าksh
จะเรียงลำดับรายการ