我打错了:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
现在我有一个名为 ^C (ctrl+C) 的文件!!当我使用时,ls
我只看到一个问号(可能是由于语言环境?)
% ls -al
total 60
drwxr-xr-x 2 root wheel 512 Jan 21 09:35 ? <- this one
drwxr-xr-x 5 admin wheel 512 Jan 21 16:24 .
drwxr-xr-x 3 root wheel 512 Jan 20 14:29 ..
-rw-r--r-- 1 admin nobody 1114 Jan 20 19:10 .cshrc
-rw------- 1 admin wheel 6002 Jan 21 15:27 .history
-rw-r--r-- 1 admin nobody 182 Jan 20 14:29 .login
-rw-r--r-- 1 admin nobody 91 Jan 20 14:29 .login_conf
-rw------- 1 admin nobody 301 Jan 20 14:29 .mail_aliases
-rw-r--r-- 1 admin nobody 271 Jan 20 19:04 .mailrc
-rw-r--r-- 1 admin nobody 726 Jan 20 19:05 .profile
-rw------- 1 admin nobody 212 Jan 20 14:29 .rhosts
-rw-r--r-- 1 admin nobody 911 Jan 20 19:06 .shrc
drwx------ 2 admin nobody 512 Jan 20 15:05 .ssh
drwxr-xr-x 2 admin wheel 512 Jan 20 19:08 bin
和
% ls -i
3611537 ? 3611534 bin
我想删除这个文件。我尝试mv
使用制表符完成时显示:
% mv
^C/ bin/
显然我不能输入 ^C :-/ 如何删除这个文件?
^V
( ctrl+ v) 用作下一次按键的一种转义序列,插入关联的值,而不是采取通常关联的任何操作。利用这一点,
^V^C
( ctrl+ v, ctrl+ c) 应该可以在终端中输入您的困难文件名。您也可以通过 inode 删除文件:
无论你做什么,看在上帝的份上,不要放在
-delete
前面-inum
:恭喜,您刚刚清除了所有文件。有了
find
,参数顺序很重要!另一种选择是使用
rm -ri ./*
;rm
在删除任何文件和目录之前会询问您,因此您只需回复y
“坏”文件以及n
所有其他文件。实际上,在您的情况下,您甚至可以减少所需的回复数量
rm -ri ./?
,因为您的“坏”文件只有一个字符长。一种选择是使用除
ls
. 如果您知道它是由逐字生成的Ctrl+生成的,则可以使用控制字符表或使用更友好的界面(如 Python 提供的界面)C找到生成的 ASCII 字符:另一种选择是查看 的输出的十六进制转储
ls
,例如使用hexdump
.然后,您可以使用(例如)此 bash 命令删除该文件:
(仅当您尝试打印的字符在
IFS
变量中时才需要双引号,例如\x20
or\x0A
,但引用命令替换是一个好习惯,除非您知道您希望 shell 执行字段拆分等)通常在这种情况下,很容易想出与相关文件匹配的通配符模式。
在您的情况下,这很简单
?
(将所有文件名与一个字符匹配)。只需检查它是否真的符合您的要求:
然后删除目录:
您也可以将其与制表符完成结合起来。你可以输入
并按 Tab,例如在 bash 中,它将被替换为
然后你可以按回车键,它会做你想做的事。
您可以使用 Midnight Commander (mc) 删除文件 - 只需使用向上/向下按钮选择并按 F8。
当文件名由于编码而具有奇怪的字符时,我偶尔会这样做。
另一种方式:用于
stat
获取目录名称的转义表示:现在您知道了文件名的表示形式,因此您可以使用以下命令按名称删除文件
printf
:或者,如果您使用 bash,则可以避免
printf
:对我有用的解决方案是:
循环浏览可用文件,直到找到要删除的文件。
但是您确实需要在 shell 中进行必要的设置才能使其正常工作。
最简单的方法是将所有内容移动到临时目录,然后
rm -r DIRNAME
.如果它是唯一的空目录(或者您不关心删除其他空目录),请使用
rmdir */
. 您将收到rmdir
有关无法删除非空目录的错误消息,但这很好。GNUrmdir
支持--ignore-fail-on-non-empty
,或者你可以2>/dev/null
。尾随
/
使 glob 仅匹配目录名称。您可以提前检查当前目录下存在哪些空目录,使用
find -maxdepth 1 -type d -empty -ls
. (如果需要,您可以更改为-ls
)-delete
。您可以使用更具体的 glob 表达式,例如
rmdir [^A-Za-z0-9._]/
匹配以非字母数字或下划线文件名开头的目录。我也包括了.
,但是 glob 表达式无论如何都不会.
正常匹配。正如其他人指出的那样,您可以将其限制为具有以下内容的单字符名称
?
:rmdir ?/
rmdir
没有这样的-i
选择rm
,大概是因为空目录通常没有价值,只能重新创建。