สมมติว่า "foreign" หมายถึง "ไม่ใช่อักขระ ASCII" จากนั้นคุณสามารถใช้find
กับรูปแบบเพื่อค้นหาไฟล์ทั้งหมดที่ไม่มีอักขระ ASCII ที่พิมพ์ได้ในชื่อ:
LC_ALL=C find . -name '*[! -~]*'
(ช่องว่างเป็นอักขระตัวแรกที่พิมพ์ได้ที่อยู่ในรายการhttp://www.asciitable.com/ซึ่ง~
เป็นอักขระตัวสุดท้าย)
คำแนะนำสำหรับการLC_ALL=C
เป็นสิ่งจำเป็น (ที่จริงLC_CTYPE=C
และLC_COLLATE=C
) มิฉะนั้นช่วงตัวอักษรที่ถูกตีความอย่างไม่ถูกต้อง glob(7)
ดูเพิ่มเติมหน้าคู่มือ เนื่องจากLC_ALL=C
สาเหตุfind
ที่แปลสตริงเป็น ASCII มันจะพิมพ์อักขระหลายไบต์ (เช่นπ
) เป็นเครื่องหมายคำถาม ในการแก้ไขปัญหานี้ไปป์ไปยังบางโปรแกรม (เช่นcat
) หรือเปลี่ยนเส้นทางไปยังไฟล์
แทนที่จะระบุช่วงอักขระคุณ[:print:]
สามารถใช้เพื่อเลือก "อักขระที่พิมพ์ได้" อย่าลืมตั้งค่าโลแคล C หรือคุณมีพฤติกรรมตามอำเภอใจ (ดู)
ตัวอย่าง:
$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π
$ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π