CentOS6.9中用touch命令创建名字为#的文件时报错
[root@sotneC6 tmp]# touch #
touch: missing file operand
Try `touch --help' for more information.
百度了一下,发现原因是shell把特殊字符#解释为注释符,所以touch后面因缺少操作数报错。解决方法有两个:一是将文件名加上单引号;二是指明文件的绝对路径或相对路径(不能直接是文件名)。(参考:如何在Linux中操作文件名有空格和特殊字符)
[root@sotneC6 tmp]# touch '#' # 扩单引号的文件名
[root@sotneC6 tmp]# ls
* #
[root@sotneC6 tmp]# touch ./# # 指明相对路径的文件名
[root@sotneC6 tmp]# ls
* #
[root@sotneC6 tmp]# touch "#" # 扩双引号的文件名
[root@sotneC6 tmp]# ls
* #
创建名字为!和@的文件名是可以正常创建的
[root@sotneC6 tmp]# touch ! @
[root@sotneC6 tmp]# ls
! @ #
以其他特殊字符*、?、.、…、/、-为文件名的文件无法正常创建,需按以上方法特殊处理
[root@sotneC6 tmp]# touch '*' "?" ./. '..' '/' '-'
[root@sotneC6 tmp]# ls
! ? @ * #
[root@sotneC6 tmp]# touch ./-
[root@sotneC6 tmp]# ls
- ! ? @ * #
输入命令后发现 . … / 这三个特殊符号不适用以上方法创建,有点麻烦,应该是shell把三个符号分别解释为当前目录、当前目录上一级目录和根目录。查阅资料得知不能创建文件名包含/的文件除非有Unicode支持。名字为/的文件先不管了,找到一种方法可以让文件名包含.和…(用\让shell忽略下一个字符,得到文件名开头为空格的文件)
[root@sotneC6 tmp]# touch \ .
[root@sotneC6 tmp]# ls
. - ! ? @ * #
[root@sotneC6 tmp]# touch \ ..
[root@sotneC6 tmp]# ls
. .. - ! ? @ * #
至此,创建了文件名为- ! ? @ * #和名字包含. …的文件