Linux Shell:删除名称包含空格和特殊字符的文件

在Linux下面有时候会碰到文件名中含有特殊的字符,这种情况下一般的删除方式是无效的,需要加单引号、\等才能删除文件。

Linux下面文件名中的特殊字符:

  • ;
  • &
  • $
  • ?
  • *
  • White spaces, backslashes and more.

在这个快速提示中,我将向您展示如何删除或复制Linux上名称包含奇怪字符的文件。

问题与解决方法

您的默认bash shell将其中许多特殊字符(也称为元字符)视为命令。如果尝试删除或移动/复制此类文件,则可能会导致错误。在此示例中,我试图删除名为“> file”的文件:

$ rm >file

样本输出:

rm: missing operand
Try `rm --help' for more information.

提示1:将文件名放在引号中

需要以下命令来复制或删除名称中带有空格的文件,例如:

$ cp "my resume.doc" /secure/location/
$ rm "my resume.doc"

引号还可以防止shell解释许多特殊字符,例如:

$ rm -v ">file"
removed `>file'

双引号会保留所有包含的字符的值,但美元符号,反引号和反斜杠除外。您也可以尝试使用单引号,如下所示:

$ rm -v 'a long file   name  here'
$ cp 'my mp3 file.mp3' /backup/disk/

提示2:尝试反斜杠

您始终可以在文件名中的特殊字符之前插入反斜杠():

$ cp "my resume.doc" /secure/location/
$ rm "*file

提示3:在文件名开头尝试./。

删除文件’-file’的语法如下:

$ rm -v ./-file
removed `./-file'

文件名开头的./强制rm不解释–作为rm命令的选项。

提示4:尝试在文件名开头输入-

A —表示选项结束,并通过Shell禁用进一步的选项处理。-之后的所有参数均被视为文件名和参数。–的参数等效于–。语法为:

$ rm -v -- -file
$ rm -v -- --file
$ rm -v -- "@#$%^&file"
$ rmdir -v -- "--dirnameHere"

提示5:按索引节点编号删除文件

ls的-i选项显示每个文件的索引号(索引节点):

ls -li

如果文件的inode号为4063242,请使用以下find命令删除该文件:

$ find . -inum 4063242 -delete

要么

$ find . -inum 4063242 -exec rm -i {} ;

有关本技巧中的find,rm和bash命令的更多信息和选项,请在Linux提示符下键入以下命令以阅读手册页:

$ man find
$ man rm
$ man bash
每日一句话科技资讯 | 20200521
每日一句话科技资讯 | 20200520