处理名字包含井号(#)的文件
符号#在 BASH 里有非常特别的含义。#之后的一切都会被认为是评论,因此会被 BASH 忽略。
通过例子来加深理解:
创建一个名字是 #abc.txt 的文件:
$ touch#abc.txt
测试输出
touch:missing file operand
Try'touch --help'formore information.
出现上面错误的原因是,BASH 将 #abc.txt 解释为评论而忽略了。所以命令 touch没有收到任何文件作为参数,所以导致这个错误。
要解决这个问题,你可能需要告诉 BASH 不要将 # 解释为评论。
$ touch./#abc.txt
或者
$ touch'#abc.txt'
检查刚创建的文件:
$ ls-l
total0
-rw-r--r--1avi avi0Jun812:14#abc.txt
现在创建名字中除了开头的其他地方包含 # 的文件。
$ touch./a#bc.txt
$ touch./abc#.txt
或者
$ touch'a#bc.txt'
$ touch'abc#.txt'
运行 ‘ls -l‘ 来检查:
$ ls-l
total0
-rw-r--r--1avi avi0Jun812:16a#bc.txt
-rw-r--r--1avi avi0Jun812:16abc#.txt
如果同时创建两个文件(比如 a 和 #bc)会怎么样:
$ touch a.txt#bc.txt
检查刚创建的文件:
$ ls-l
total0
-rw-r--r--1avi avi0Jun812:18a.txt
很明显上面的例子中只创建了文件 a 而文件 #bc 被忽略了。对于上面的情况我们可以这样做,
$ touch a.txt./#bc.txt
或者
$ touch a.txt'#bc.txt'
检查一下:
$ ls-l
total0
-rw-r--r--1avi avi0Jun812:20a.txt
-rw-r--r--1avi avi0Jun812:20#bc.txt
可以这样移动文件:
$ mv./#bc.txt./#cd.txt
或者
$ mv'#bc.txt''#cd.txt'
这样拷贝:
$ cp./#cd.txt./#de.txt
或者
$ cp'#cd.txt''#de.txt'
可以使用你喜欢的编辑器来编辑文件:
$ vi./#cd.txt
或者
$ vi'#cd.txt'
$ nano./#cd.txt
或者
$ nano'#cd.txt'
这样删除:
$ rm./#bc.txt
或者
$ rm'#bc.txt'
要删除所有以井号(#)开头的文件,可以这样:
# rm ./#*
处理名字包含分号(;)的文件
如果你还不知道的话,分号在 BASH 里起到命令分隔的作用,其他 shell 可能也是一样的。分号作为分隔符可以让你一次执行几个命令。你碰到过名字包含分号的文件吗?如果没有的话,这里有例子。
创建一个名字包含分号的文件。
$ touch;abc.txt
测试输出
touch:missing file operand
Try'touch --help'formore information.
bash:abc.txt:commandnotfound
出现上面错误的原因是,在运行上面命令的时候 BASH 会把 touch 解释为一个命令但是在分号前没有任何文件参数,所以报告错误。然后报告的另一个错误找不到命令 abc.txt,只是因为在分号后 BASH 会期望另一个新的命令,而 abc.txt 并不是一个命令。
要解决这个问题,我们得告诉 BASH 不要将分号解释为命令分隔符,��如:
$ touch./';abc.txt'
或者
$ touch';abc.txt'
注意:我们将文件名用单引号 '' 包含起来。这样可以告诉 BASH 分号 ; 是文件名的一部分而不是命令分隔符。
对名字包含分号的文件和文件夹的其他操作(就是,拷贝、移动、删除)可以直接将名字用单引号包含起来就好了。