如何在Linux中创建,打开,查找和删除破折号的文件名
在本教程指南中,我将为我们简要介绍虚线文件名及其用法,并举例说明如何创建,打开,读取,访问,查找和删除名称以破折号(-)或者双破折号(- -
),根据Posix标准
什么是Posix中的单破折号(-)和双破折号(-)?
根据Posix准则
所有选项都应以'-'分隔符开头。
因此,任何工具提供的所有选项,例如最常用的选项
--help
或者-h
都应以单破折号(`-)开头。对于使用操作数表示要为读取或者写入而打开的文件的实用程序,应使用"-"操作数仅表示"标准输入"(或者从上下文中可以清楚地看到输出文件时是"标准输出")。
被指定)或者名为-
的文件应该将不是选项参数的第一个参数-作为分隔符,以指示选项的结尾。
以下所有自变量都应视为"操作数",即使它们以"-"字符开头。
如何创建虚线的文件名和目录?
通常我们使用touch
创建一个空文件。
但是,如果我们尝试创建一个以破折号(-)开头的文件,或者只是一个破折号的文件名(--)。
# touch
命令执行成功,但未创建文件。
# ls -l total 0
类似地,如果我们使用touch来创建以(--)开头的文件,则该命令会失败,因为该命令假定我们试图将输入参数而不是操作数传递给命令
# touch -file touch: invalid option -- 'i' Try 'touch --help' for more information.
尽管有一些" hacks",我们可以其中添加内容到文件中,这也会创建文件:
# echo "some content" >
验证文件
# ls -l total 4 -rw-r--r-- 1 root root 13 Jan 18 15:01
我们也可以使用" hacks",将命令的输出发送到(-
),这也会创建一个虚线文件名。
# date > # hostname >>
"创建虚线文件名的正确方法"是在文件名之前添加路径前缀
# touch ./
验证文件
# ls -l total 0 -rw-r--r-- 1 root root 0 Jan 18 14:56
一些更多的例子:
# touch ~/dir/ # ls -l ~/dir/ total 0 -rw-r--r-- 1 root root 0 Jan 18 14:57
如果我们打算创建一个虚线文件名,例如(-file),那么我们也可以使用(-
),这意味着option of end
。
# touch -- -file # ls -l total 0 -rw-r--r-- 1 root root 0 Jan 18 15:31 -file
我们还可以将其与路径结合使用以创建文件:
# touch -- ./-file2
它仍然可以工作
# ls -l total 0 -rw-r--r-- 1 root root 0 Jan 18 15:31 -file -rw-r--r-- 1 root root 0 Jan 18 15:33 -file2
我们可以使用相同的方法"创建目录"
# mkdir ~/dir/-mydir # mkdir -- -dir2
验证虚线目录
# ls -l ~/dir/
如何打开和读取破折的文件名?
cat的常规语法将不起作用,因为cat会将(-)视为STDIN并等待用户INPUT在屏幕上显示。
# cat
我们可以调整cat
语法来检查(-
)的内容
# cat < server1.example.com
虚线文件名的"查看内容的正确方法"将再次加上文件路径的前缀
# cat ./ Mon Jan 18 15:02:44 IST 2017 server1.example.com
我们可以使用任何受支持的命令,例如more
,less
,tail
和head
来使用带有文件名的路径查看内容。
# more ./ Mon Jan 18 15:02:44 IST 2017 server1.example.com
我们也可以结合使用双破折号(-)和cat或者其他类似命令来查看破折的文件名
# echo "some content" > -file # echo "some more content" > -file2
使用(--
)查看文件内容
# cat -- -file some content # cat -- -file2 some more content
如何删除破折号的文件名和目录?
我们可以使用简单的rm
命令删除单破折号(-)文件
# rm -vf removed '-'
但这将无法删除破折的文件名
# rm -vf -file rm: invalid option -- 'l' Try 'rm ./-file' to remove the file '-file'. Try 'rm --help' for more information.
由于rm会将-file
视为输入参数而不是操作数。
删除破折的文件名的正确步骤是将rm和(-)组合在一起,即选项的结尾
# rm -vf -- -file* removed '-file' removed '-file2'
或者提供带有文件名的路径
# rm -vf ./* removed './-' removed './-file' removed './-file2'
或者,我们也可以在路径前面加上文件名:
# rm -vf ~/dir/*
如何查找以破折号开头的文件和目录?
我们还可以使用" find"命令来搜索虚线文件名,并使用find exec grep执行任何操作。
例如,要打印以(-
)开头的所有文件(仅文件名)
# find /root/dir/-type f -name "-*" -printf "%f\n" -file2 -file1
或者搜索特定文件并使用路径打印
# find /root/dir/-type f -name "-file" /root/dir/-file
我们也可以使用正则表达式来查找文件(-
)。
其中我们开始使用.* /
,因为find匹配整个路径。
# find /root/dir/-type f -name "*" -regex ".*/[-]" -printf "%f\n"
查找虚线的文件名
或者查找以(-
)开头的文件
# find /root/dir/-type f -name "*" -regex ".*/[-].*" -printf "%f\n"
查找以破折号(-)开头的文件
查找和删除以破折号(-
)开头的文件
# find /root/dir/-type f -name "-file" -exec rm -fv {} \; removed '/root/dir/-file'
查找以(-
)开头的目录
# find /root/dir/-type d -name "-*" -printf "%f\n" -dir1 -dir2
查找和删除虚线目录
# find /root/dir/-maxdepth 1 -type d -name "-*" -exec rm -rvf {} \; removed directory '/root/dir/-dir1' removed directory '/root/dir/-dir2'
我们也可以在脚本中使用类似的命令来处理Linux和Unix中的虚线文件名或者目录名。