在 Bash 的路径名中写什么而不是 \x20 ?

use*_*764 1 command-line unicode paths filename

我有一个名为“My Book”的外置硬盘。当我使用命令时:

find /dev/disk/
Run Code Online (Sandbox Code Playgroud)

它告诉我它在

/dev/disk/by-label/My\x20Book
Run Code Online (Sandbox Code Playgroud)

但是,当我输入

find /dev/disk/ | grep My\x20Book
Run Code Online (Sandbox Code Playgroud)

它只是给了我错误

find: `/dev/disk/by-label/Myx20Book': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法但没有成功:

find /dev/disk/ | grep My\x20Book
find /dev/disk/ | grep My' 'Book
find /dev/disk/ | grep "My Book"
find /dev/disk/ | grep My\ Book
Run Code Online (Sandbox Code Playgroud)

在 Bash 的路径名中输入这个特殊字符的正确方法是什么?

mur*_*uru 5

如果路径My\x20Book带有反斜杠,则必须尝试grepgrep和 from转义反斜杠bash,这可以通过对每个级别使用两次反斜杠来完成:

$ echo 'My\x20Book' | grep My\\\\x20Book
My\x20Book
Run Code Online (Sandbox Code Playgroud)

shell 将每个都减少\\\,因此grep接收My\\x20Book,然后 grep 减少\\\,以便它最终匹配 just My\x20Book

为了保护不受外壳的影响,您可以引用反斜杠,并消除外部反斜杠:

$ echo 'My\x20Book' | grep 'My\\x20Book'
My\x20Book
Run Code Online (Sandbox Code Playgroud)

为了防止grep,您可以告诉它使用固定字符串而不是正则表达式,现在只使用一个反斜杠:

$ echo 'My\x20Book' | grep -F 'My\x20Book'
My\x20Book
Run Code Online (Sandbox Code Playgroud)

顺便说一句,由于您正在使用find,您可以直接使用其过滤功能:

$ touch 'My\x20Book'
$ find . -name 'My\\x20Book'
./My\x20Book
Run Code Online (Sandbox Code Playgroud)