我们的 Global Linux 3.0.31-0.9 服务器中有人放置了一个文件名中包含多个空格、括号、问号和冒号的文件。
我已经无计可施,无法重命名或删除它了!
附上了我尝试删除/重命名文件为“乱码”的文件名和命令的示例这里。
我的ls
输出:
-rw-r--r-- 1 root root 11306 May 2 03:25 who suggesting to assign this issue to the group which is responsible for the application StreamServe. (Probably it is operated by Linq????:q
-rw------- 1 root root 15797 Jun 12 12:59 .viminfo
-rw------- 1 root root 1200 Jun 12 13:00 .lesshst
drwxrwxrwx 32 root root 4096 Jun 13 00:00 .snapshot
-rw------- 1 root root 32976 Jun 13 14:05 .bash_history
答案1
对名称难以输入的文件进行操作的简单方法是使用补全。在这种情况下,由于名称的前几个字符很容易键入,因此键入它们,然后按Tab。
$ mv 谁Tab找到了.txt
如果无法确定第一个字符,可以按Tab,./
循环查看当前目录中的所有文件名。
shell 的完成命令将使用'
or\
或无论如何编程生成一个带引号的字符串。
或者,您可以自己制作这个带引号的字符串。在单引号内,除了单引号本身之外,所有字符都会被正常解释。因此,如果文件名不包含任何单引号,请将其粘贴在单引号之间 - 但您需要有实际的文件名(如 打印的那样ls --show-control-chars
),而不是用一些不可打印字符替换的文件名。如果文件名中有单引号,则将其替换为'\''
(单引号、反斜杠、单引号、单引号)。例如,对于名为 的文件it's
,您可以使用'it'\''s'
.
或者,您可以制作仅与该文件匹配的通配符模式。例如,在这种情况下:
$ ls -d w*
who suggesting to assign this issue to the group which is responsible for the application StreamServe. (Probably it is operated by Linq????:q
wibble
在我的示例中,有两个匹配的文件,因此通配符不够好。添加一个角色就可以了。
$ ls -d wh*
who suggesting to assign this issue to the group which is responsible for the application StreamServe. (Probably it is operated by Linq????:q
mv who* found.txt
如果第一个字符不可打印,您可以选择与名称的不同部分匹配的另一个模式。您可以使用类似[!#-z]*
or[!0-9A-Z_a-z]*
或的模式[![:alnum:]]*
来排除文件名开头常用的字符。
如果文件名以-
(ASCII 破折号或连字符)开头,则它可能会被解释为一个选项。使用./-wibble
来避免这种情况。
答案2
将有问题的文件名括在引号中可能是删除或重命名它的最简单方法。首先创建一个测试文件:
rm " -myfile(1):ok?"
如果文件仅以连字符开头,请使用“--”告诉命令不存在更多选项,并且前导连字符是命令参数:
rm -- -myfile
如果您的文件名包含不可打印的字符,您可以在find
确定其索引节点号后将其删除:
find . -iname "*myfile*" -exec ls -i {} +
9225180 ./ -myfile(1): 可以吗?
find . -inum 9225180 -exec rm -i {} +
删除 ./ -myfile(1): 可以吗?
-i
将(交互式)响应添加到命令中,例如rm
允许您确认您正在对您想要的实体进行操作。