如何在Linux中创建,打开,查找和删除破折号的文件名

时间:2020-02-23 14:40:13  来源:igfitidea点击:

在本教程指南中,我将为我们简要介绍虚线文件名及其用法,并举例说明如何创建,打开,读取,访问,查找和删除名称以破折号(-)或者双破折号(- -),根据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

我们可以使用任何受支持的命令,例如morelesstailhead来使用带有文件名的路径查看内容。

# 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中的虚线文件名或者目录名。