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


44

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

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 ?
(  )  *  ?  \

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


Answers:


43

该命令是模棱两可的,因为通常使用空格分隔参数。cd不知道您要做什么,但是有两种解决方法:

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

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

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

cd "Milano, Torino (Jan)-Compressed"

26

小提示:制表符补全;-)

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

另一种方法:下降

  1. 如果可以看到目录,并且要使用终端访问它,则只需键入:cdfirst,然后将目录拖放到终端上,然后单击enter

24

写为:

cd 'Milano, Torino (Jan)-Compressed'

否则,将其视为Milano,文件夹名称。发生这种情况是由于文件夹名称中有空格。或者,转义一些特殊字符:

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

22

tl; dr:要引用特殊字符,请用反斜杠\将其转义或用双" "引号或单引号引起来' 'Tab ↹完成需要适当的报价。


您要的是所谓的报价

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

用转义符报价 \

不带引号的反斜杠(\)是转义字符。它会保留下一个字符的字面值,但除外<newline>

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

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 “?”

bashProgrammable Completion(又名Tab ↹Completion)会自动使用转义字符转义特殊字符\

用双引号报价 " "

在双引号包围的字符保留了引号中的所有字符的字面意义,例外$`\,和,启用了历史扩展的时候,!

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

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 “?”

与一样$`!在双引号中保留其特殊含义,对双引号字符串执行Parameter ExpansionCommand SubstitutionArithmetic ExpansionHistory Expansion

用单引号报价 ' '

将字符括在单引号中可保留引号内每个字符的字面值。即使在单引号之前加反斜杠,也不能在单引号之间引起单引号。

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

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 “\”

您可以在man bash/ QUOTINGwiki.bash-hackers.orgtldp.org上找到有关报价的更多信息。


10

类似于C的字符串和$'string'

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

$'string'形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。

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

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

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

您可以使用字符十六进制值,例如:

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

打印

与以前相同的想法-利用转义符:

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

使用索引节点:

每个文件或目录都有与之关联的特殊数据结构,称为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

请注意使用./-防止文件名中包含前置符的保护措施-


6

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


3
或以反斜杠逃脱空间,例如:cd /home/kudic/Radna\ površina
Timo

好点!我忘了提。我通常出于习惯使用引号,但从长远来看,反斜杠实际上更好。
科里·惠特克

1
'Radna površina'如果您不希望$VARNAME扩展环境变量()并使用反引号$()将命令括起来或运行(或者文件名中包含双引号),请使用单引号()。
伊利亚·卡根

3

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

cd "Milano, Torino (Jan)-Compressed"

否则给出绝对路径:

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

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


如果以前斜杠开头的路径是从根开始的。您可能要删除它。
isaaclw 2012年

@isaaclw这就是为什么他将其归档为绝对路径:P

1
啊,那是三个点,表示一个“变量”文件夹。我以为是两个点,表示“父文件夹”。道歉。
isaaclw 2012年

3

尽管不是最佳选择,但另一个选择是使用通配符。你可以试试:

cd *Torino*

当目录名称中存在不被他人共享的独特单词或短语时,最好使用此方法。例如,我有挂载点/ media / DataSSD和/ media / DataHDD。在我输入名称的一半左右之前,自动补全功能不起作用,因此只需输入我的硬盘分区

cd /media/*HD*

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.