Linux在文件名中的特殊和转义字符

时间:2020-03-05 15:28:55  来源:igfitidea点击:

在Linux中,空格是一个特殊的字符和最常用的字符之一。
它将命令或者参数分开到命令。
例如,Copy命令将分配给它的第一个文件视为源文件和第二文件作为目标文件。

这两个文件参数由空格分隔。
因此,如果文件名包含空格,则会在命令行上创建问题。
本教程我们讨论如何使用特殊字符创建文件以及如何有效地在命令行上使用它们。

处理特殊字符

让我们尝试使用触摸命令的名称创建一个带空格的文件。

$touch file with spaces
$ls -l
total 0
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:04 file
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:04 spaces
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:04 with

上面的输出中的LS命令显示我们没有收到单个文件,而是三个文件,例如:文件,空格和与之。

这是因为触摸命令认为名称为三个不同的文件,而不是作为单个文件。

有两种方法可用于处理具有特殊含义的shell 体的这些字符。
首先,一个是使用引号,第二个是具有转义字符。

引号

最简单的方法是使用文件名的引号。
现在,让我们尝试使用引号创建上面的文件。

$touch 'file with spaces'
$ls -l
total 0
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:04 file
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:10 file with spaces
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:04 spaces
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:04 with

现在,我们可以看到名为"带空格的文件"的文件。
单引号和双引号都可以与文件名一起使用,但建议使用单引号。
这是因为一些特殊字符不能被双引号逃脱。
单引号也处理它们。
其他特殊字符像$,*,?
等也可以用于文件名。

$touch '?file'
$touch '*file'
$touch '$file'
$ls -l
total 0
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:17 ?file
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:17 $file
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:17 *file

另一个例子

$rm ‘File*.txt’

在上面的例子中,引号更为重要。
因为是一个与任何字符匹配的shell通配符,如果我们不使用引号,我们将遇到麻烦。
如果没有引号,shell按预期删除文件
.txt,但在添加文件中,file2.txt,file22.txt和其他人将被删除。

转义字符

这是另一种方法,可用于其名称中具有特殊字符的文件。
反斜杠字符逃离其后面的字符。
这意味着立即遵循反斜杠字符的字符被shell视为正常字符,而不是特殊字符。

例如,我们可以使用反斜杠创建包含其名称中空格的文件。

$touch escaping\ with\ backslash.txt
$ls -l
total 0
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:23 escaping with backslash.txt

同样,其他特殊字符也可以使用反斜杠逃脱:

$touch escape\?
$touch escape\*
$touch escape$
$ls -l
total 0
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:24 escape?
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:24 escape$
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:24 escape*
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:23 escaping with backslash.txt

现在,我们已经看到引号(单或者双)和反斜杠字符是用于处理特殊字符的特殊字符。
那么你如何在文件名中使用这些字符?
对于引号,我们可以使用backslash:

$ls
$touch quote\'mark
$touch quote\"mark
$ls -l
total 0
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:28 quote'mark
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:28 quote"mark

那很简单。
那么反斜杠怎么样?
请记住,Backslash立即逃离每一个特殊角色吗?
所以我们使用反斜杠来逃避反斜杠本身。

$touch escape\backslash
$ls -l
total 0
-rw-r--r-- 1 raghu raghu 0 2012-08-11 09:30 escape\backslash