Bash

為什麼這個 find 命令不返回僅包含非 ASCII 字元的文件名?

  • March 8, 2016

find我正在嘗試確定此命令不起作用的根本原因;它不應該與下面呼叫的文件匹配this_should_not_match

$ > find . -type f -name "*[^ -~]*"
./__º╚t
./this_should_not_match
./__╞_u
./__¡VW
./__▀√Z
./__εè_
./__∙Σ_
./__Σ_9
./__Σhm
./__φY_

我的外殼是 Bash 3.2

範圍僅在 C 語言環境中可靠且可移植地工作。在其他語言環境中,您會得到一些變化,但通常[x-y]會得到字元(實際上是整理元素,它甚至可以匹配字元序列),這些字元以某種排序順序x在前後y排序,這通常是模糊的,並且並不總是與sort使用的相同。

在 C 語言環境中(請參閱“LC_ALL=C”做什麼?),字元是字節,範圍基於字元的程式碼點(基於字節值)。

LC_ALL=C find . -type f -name "*[^ -~]*"

在基於 ASCII 的系統上(大多數;POSIX 不保證 C 語言環境使用 ASCII 字元集,但實際上,除非您使用一些基於 EBCDIC 的特殊 IBM 大型機作業系統(但隨後您會知道) , 您將使用 ASCII) 將列出名稱中包含 32 到 126 以外的字節的正常文件。

另請注意,在多字節字元語言環境中(如 UTF-8 語言環境,現在的規範),它*甚至可能不匹配某些系統上的所有文件名,它將無法匹配不形成有效字元的字節序列.

引用自:https://unix.stackexchange.com/questions/268401