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

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

我想要在终端进入以下文件夹:

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 补全;-)

  1. 只需输入第一个字母 eg cd Mi(或更多字母,如果需要)并按Tab。终端将帮助您完成其余的单词。

其他方式:降低

  1. 如果您可以看到该目录并且想要使用终端访问它,只需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

请注意使用./- 来防止文件名-中包含前导字符。

相关内容