如何输入名称中包含特殊字符的文件或目录?
我想在终端中输入以下文件夹:
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/
一个小提示: 标签完成 🙂
- 只需键入第一个字母,例如
cd Mi
(如果需要,可输入更多字母),然后按Tab键 。 终端将通过完成其余的单词来帮助您。
另一种方式: 拖放
- 如果您可以看到该目录,并且您想使用终端访问它,只需键入:
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*