我们经常会看到文件名和文件夹名。大多数时候文件/文件夹的名字和内容相关并以数字和字母开头。字母加数字的文件名最常见,应用也很广泛,但总会需要处理一些包含特殊字符的文件名/文件夹名。
注意:我们可能有各种类型的文件,但是为了简单以及方便实现,在本文中我们只用文本文件(.txt)做演示。
最常见的文件名例子:
-
abc.txt
-
avi.txt
-
debian.txt
-
...
数字文件名例子:
-
121.txt
-
3221.txt
-
674659.txt
-
...
字母数字文件名例子:
-
eg84235.txt
-
3kf43nl2.txt
-
2323ddw.txt
-
...
包含特殊字符的文件名的例子,并不常见:
-
#232.txt
-
#bkf.txt
-
#bjsd3469.txt
-
#121nkfd.txt
-
-2232.txt
-
-fbjdew.txt
-
-gi32kj.txt
-
--321.txt
-
--bk34.txt
-
...
一个显而易见的问题是 - 在这个星球上有谁会创建和处理包含井号(#)
,分号(;)
,破折号(-)
或其他特殊字符的文件/文件夹啊。
我和你想的一样,这种文件名确实不常见,不过在你必须得处理这种文件名的时候你的 shell 也不应该出错或罢工。而且技术上来说,Linux 下的一切比如文件夹、驱动器或其他所有的都被当作文件处理。
处理名字包含破折号(-)的文件
创建以破折号(-)
开头的文件,比如 -abx.txt。
-
$ touch -abc.txt
测试输出
-
touch: invalid option --'b'
-
Try'touch --help'for more information.
出现上面错误的原因是,shell 把破折号(-)
之后的内容认作参数了,而很明显没有这样的参数,所以报错。
要解决这个问题,我们得告诉 Bash shell(是的,这里以及本文后面的大多数例子都是基于 BASH 环境)不要将特殊字符(这里是破折号)后的字符解释为参数。
有两种方法解决这个错误:
-
$ touch ---abc.txt [方法#1]
-
$ touch ./-abc.txt [方法#2]
你可以通过运行命令 ls 或 ls -l 列出详细信息来检查通过上面两种方式创建的文件。
-
$ ls -l
-
total 0
-
-rw-r--r--1 avi avi 0Jun811:05-abc.txt
要编辑上述文件可以这样:
-
$ nano ---abc.txt
-
或者
-
$ nano ./-abc.txt
注意:你可以将 nano 替换为任何其他你喜欢的编辑器比如说 vim:
-
$ vim ---abc.txt
-
或者
-
$ vim ./-abc.txt
如果只是简单地移动文件可以这样:
-
$ mv ---abc.txt -a.txt
-
或者
-
$ mv ---a.txt -abc.txt
删除这种文件,可以这样:
-
$ rm ---abc.txt
-
或者
-
$ rm ./-abc.txt
如果一个目录下有大量这种名字包含破折号的文件,要一次全部删除的话,可以这样:
-
$ rm ./-*
重要:
-
上面讨论的规则可以同样应用于名字中包含任意数量以及任意位置的连接符号的文件。就是说,-a-b-c.txt,ab-c.txt,abc-.txt,等等。
-
上面讨论的规则可以同样应用于名字中包含任意数量以及任意位置连接符号的文件夹,除了一种情况,在删除一个文件夹的时候你得这样使用
rm -rf
:$ rm -rf -- -abc 或者 $ rm -rf ./-abc