find 中文乱码问题

在linux上使用find来找文件的时候,加上 -ls 参数。中文显示就是乱码了。

类似这样。

    /tmp/2022-06-15/test/  find                                                                                                                                              ✔ 
.
./中文文件
    /tmp/2022-06-15/test/  find -ls                                                                                                                                          ✔ 
   166682      0 drwxr-xr-x   2 pengpengxp pengpengxp       60 6月 15 15:27 .
   166694      0 -rw-r--r--   1 pengpengxp pengpengxp        0 6月 15 15:27 ./\344\270\255\346\226\207\346\226\207\344\273\266
    /tmp/2022-06-15/test/  echo $LANG                                                                                                                                        ✔ 
zh_CN.UTF-8
    /tmp/2022-06-15/test/   

查了find的文档,看起来find的-ls相当于 ls -dils

       -ls    True; list current file in ls -dils format on  standard  output.
              The  block  counts  are  of  1 KB blocks, unless the environment
              variable POSIXLY_CORRECT is set, in which case  512-byte  blocks
              are  used.   See  the  UNUSUAL FILENAMES section for information
              about how unusual characters in filenames are handled.

用-exec来执行又是正确的:

    /tmp/2022-06-15/test/  find -exec ls -dils {} \;                                                                                                                         ✔ 
166682 0 drwxr-xr-x 2 pengpengxp pengpengxp 60  6月15日 15:27 .
166694 0 -rw-r--r-- 1 pengpengxp pengpengxp 0  6月15日 15:27 ./中文文件

没有方向了。请助一下。

惹不起,绕着走就对了。

不行,我要用find-dired或者grep-dired。默认就用的这个功能。必须要解决才行。不然在emacs里面也是乱码

试试 fdfind

我都没注意 find 有这毛病。用 fd 吧。

我盲猜测的,你的Linux应该是英文环境,不是中文环境, 英文环境的 LC_ALL 应该不是 utf-8 的,导致命令行都是乱码。

你设置一下 LC_ALL=zh_CN.UTF-8 就会好。

find的手册里说了

Unusual characters are always escaped. White space, backslash, and double quote characters are printed using C-style escaping (for example ‘\f’, ‘"’). Other unusual characters are printed using an octal escape. Other printable characters (for ‘-ls’ and ‘-fls’ these are the characters between octal 041 and 0176) are printed as-is.

试试 (setq find-ls-option '("-exec ls -ldh {} +" . “-ldh”)) 或者 (setq find-ls-option '("-print0 | xargs -0 ls -alhd" . “”))

我试一下,这样可以显示中文,但是查出来的文件不能用dired-do-copy等dired的函数了。

我查了一下,是在 dired-move-to-filename 函数里面,调用 next-single-property-change的时候,没有跳转到对应的文件名上。property的东西,我还没有来得及去研究。