我想要在终端进入以下文件夹:
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 ?
( ) * ? \
一般如何在终端中输入包含特殊字符的文件或目录名?
答案1
该命令具有歧义,因为通常使用空格来分隔参数。 cd 不知道您想要做什么,但您有两种解决方法:
要么你“面具“空格(和所有其他特殊字符),以便终端知道你将空格作为字符而不是分隔符:
cd Milano\,\ Torino\ \(Jan\)-Compressed
或者你将文件夹名称或路径放入引号:
cd "Milano, Torino (Jan)-Compressed"
答案2
小提示:Tab 补全;-)
- 只需输入第一个字母 eg
cd Mi
(或更多字母,如果需要)并按Tab。终端将帮助您完成其余的单词。
其他方式:拖和降低
- 如果您可以看到该目录并且想要使用终端访问它,只需
cd
首先输入:然后将目录拖放到终端上并点击enter。
答案3
写成:
cd 'Milano, Torino (Jan)-Compressed'
否则,它将被Milano,
视为文件夹名称。这是因为文件夹名称中有空格。或者转义一些特殊字符:
cd Milano\,\ Torino\ \(Jan\)-Compressed/
答案4
类 C 字符串和 $'string'
除其他事项外,可以使用$'...'
引用类型来使用 ANSI-C 反斜杠字符(例如\n
和 )\t
,包括您提到的那些。摘自 bash 4.3 手册:
形式为 $'string' 的单词会受到特殊处理。该单词会扩展为字符串,并按照 ANSI C 标准的规定替换反斜杠转义字符。
这对于包含换行符、制表符的文件特别有用,当您编写复杂的 awk 行时,您需要使用不同的方式来区分单引号和双引号,当文件名本身包含单/双引号混合时等。
例如,创建并列出这样的文件:
$ 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
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
请注意使用./
- 来防止文件名-
中包含前导字符。