如何输入名称中包含特殊字符的文件或目录?

我想在终端中输入以下文件夹:

Milano, Torino (Jan)-Compressed 

我该怎么写命令cd才能进入这个目录?

空格和其他几个特殊字符,如\*)(?当我尝试在命令行或脚本中使用它们时会导致问题,例如:

 $ cd space dir bash: cd: space: No such file or directory $ cat space file cat: space: No such file or directory cat: file: No such file or directory $ cat ( bash: syntax error near unexpected token `newline' $ echo content >\ > ^C $ ls ? ( ) * ? \ 

如何输入终端中包含特殊字符的文件名或目录名?

该命令不明确,因为空格通常用于分隔参数。 cd不知道你想做什么,但你有两种可能性来解决它:

您可以“ 屏蔽 ”空格(以及所有其他特殊字符),以便终端知道您将空间表示为字符而不是分隔符:

 cd Milano\,\ Torino\ \(Jan\)-Compressed 

或者您将文件夹名称或路径放入引号

 cd "Milano, Torino (Jan)-Compressed" 

把它写成

 cd 'Milano, Torino (Jan)-Compressed' 

否则它将Milano,视为文件夹名称。 发生这种情况是因为文件夹名称中的空格。

或者逃避一些特殊角色……

 cd Milano\,\ Torino\ \(Jan\)-Compressed/ 

一个小提示: 标签完成 🙂

  1. 只需键入第一个字母,例如cd Mi (如果需要,可输入更多字母),然后按Tab键 。 终端将通过完成其余的单词来帮助您。

另一种方式: 拖放

  1. 如果您可以看到该目录,并且您想使用终端访问它,只需键入: cd first然后将该目录拖放到终端上并按Enter键

tl; dr :引用一个特殊字符,或者用反斜杠\来转义它,或用双引号" "或单引号括起来' '标签↹完成处理正确的引用。


你要求的是所谓的报价

引用用于删除shell中某些字符或单词的特殊含义。 (…)有三种引用机制: 转义字符单引号双引号[引自man bash引文]

引用转义字符\

未引用的反斜杠( \ )是转义字符。 它保留了下一个字符的字面值,但除外。

因此,要输入具有特殊字符的目录或文件,请使用\转义后者,例如:

 cd space\ dir # change into directory called “space dir” cat space\ file # print the content of file “space file” echo content > \\ # print “content” into file “\” cat \( # print the content of file “(” ls -l \? # list file “?” 

bash的可编程完成 (又名Tab↹完成)会自动使用转义字符\转义特殊字符。

引用双引号" "

用双引号括起字符会保留引号内所有字符的字面值,但$`\除外,并且,当启用历史记录扩展时, !

因此,要输入具有特殊字符的目录或文件,请使用双引号至少转义后者或文件名或路径的大部分,例如:

 cd space" "dir # change into directory called “space dir” cd spac"e di"r # equally cd "space dir" # equally cat "space file" # print the content of file “space file” cat "(" # print the content of file “(” ls -l "?" # list file “?” 

作为$`! 将它们的特殊含义保留在双引号中, 参数扩展 , 命令替换 , 算术扩展和历史扩展在双引号字符串上执行。

引用单引号' '

用单引号括起字符可以保留引号中每个字符的字面值。 单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。

因此,要输入具有特殊字符的目录或文件,请使用双引号至少转义后者或文件名或路径的大部分,例如:

 cd space' 'dir # change into directory called “space dir” cd spac'e di'r # equal cd 'space dir' # equal cat 'space file' # print the content of file “space file” cat '(' # print the content of file “(” ls -l '?' # list file “?” echo content > '\' # print “content” into file “\” 

你可以在wiki.bash-hackers.org和tldp.org上找到更多关于man bash / QUOTING中的 Quoting的信息 。

类C字符串和$’字符串’

除此之外,可以使用$'...'类型的引用来使用ANSI-C反斜杠字符,例如\n\t ,包括你提到的那些。 从bash 4.3手册:

$’string’forms的单词是专门处理的。 单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符。

当你编写复杂的awk行,你需要使用不同的方法来区分单引号和双引号,当文件名本身包含单/双引号mishmash等时,这对包含换行符,制表符的文件特别有用。

例如,创建和列出此类文件:

 $ touch a$'*'bc$'\n'd $ ls a$'*'bc$'\n'd a*bc?d 

您可以使用字符hex值,例如:

 $ touch 'file(name' $ ls file$'\x28'name file(name 

的printf

和以前一样 – 利用转义字符:

 $ ls "$(printf "file\x28name")" file(name $ echo "Hello World" > c$'\n'd $ cat "$(printf "c\nd")" Hello World 

使用inode:

每个文件或目录都有与之关联的特殊数据结构,称为inode,由特定的十进制数引用。 因此,您可以使用它通过find命令间接定位具有特定inode的文件,并使用它执行某些操作:

 $ echo "This is a test" > file$'('name1 $ ls -i 5898996 file(name1 5898997 file?name2 $ find -type f -inum "5898996" -exec cat {} \; This is a test 

当你可以使用glob时,避免处理单个文件

当您不必处理单个文件时,只需将shell中的* glob字符和引用变量传递给其他命令即可。 它使得处理困难的文件名变得更加容易:

 $ for f in ./*; do echo "$f" ; done file name2 file(name1 

请注意使用./ – 防范可能包含前导文件名的文件名。

要打开包含空格的文件夹,请在引号中使用cd "Some Directory"或使用反斜杠转义空格,例如: cd /home/kudic/Radna\ površina

如果此目录位于您的主文件夹中,则键入:

 cd "Milano, Torino (Jan)-Compressed" 

否则给出绝对路径:

 cd "/…/…/Milano, Torino (Jan)-Compressed" 

如果文件名中有双引号,则用\"转义

另一种选择虽然在这种情况下不是最好的但是使用通配符。 你可以试试:

cd *Torino*

当目录名称中没有其他人共享的单词或短语时,最好使用此方法。 例如,我有挂载点/媒体/ DataSSD和/ media / DataHDD。 自动完成function不起作用,直到我键入近一半的名称,以便进入我刚刚键入的硬盘分区

cd /media/*HD*