Answers:
假设“外国”的意思是“不是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
./π
LC_ALL=C
而不是,LC_COLLATE=C
因为在没有设置的情况下将LC_COLLATE设置为C LC_CTYPE
并确保即使LC_ALL变量在环境中也可以正常工作并没有多大意义。
SPC
是打印的,那么怎么样TAB
以及LF
它们也通常在文本文件中发现了什么?
LC_COLLATE
和LC_CTYPE
,另请参见find(1)
联机帮助页。
如果使用转换每个文件名tr -d '[\200-\377]'
并将其与原始名称进行比较,则任何带有特殊字符的文件名都将不同。
(以上假设您的意思是非ASCII与外部语言)
[
,这也删除了。]
tr
[
和]
我的系统上。
[
和之外]
)。谢谢。
您可以用来tr
从文件名中删除任何外来字符,并将结果与原始文件名进行比较,以查看其是否包含外来字符。
find . -type f > filenames
while read filename; do
stripped="$(printf '%s\n' "$filename" | tr -d -C '[[:alnum:]][[:space:]][[:punct:]]')"
test "$filename" = "$stripped" || printf '%s\n' "$filename";
done < filenames
find
输出进行后处理,请使用NUL终止的输出/输入,如此答案所示。