$ 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:-/
如何删除这个文件吗?
#1 楼
^V
(ctrl + v)用作下一次按键的转义序列,插入关联的值,而不是执行通常将要执行的任何操作。使用此功能,
^V^C
( ctrl + v,ctrl + c)应该可以在终端中输入您困难的文件名。评论
这可能是OP首先打错字的方式。 V和C在键盘上彼此相邻。
– Stig Hemmer
18年1月22日在10:38
或者他们试图在bsd终端上使用Windows剪贴板。
–乔尔·科尔(Joel Coel)
18年1月24日,3:12
@JoelCoel习惯永不消亡!
–Mafii
18年1月24日在15:43
有趣的是,^ V ^ C在Zsh行编辑器中不起作用。带引号的插入小部件(在页面中搜索^ V)明确不插入中断字符。 Jakob的答案(使用printf)可能是在shell参数中提供控制字符的更可移植的方式。
–里程
18年1月25日在6:41
@StigHemmer:还可能发生的情况是,您在命令中间按Ctrl-C,然后忘记此操作并稍后将其复制粘贴。
–user541686
18年1月29日在7:51
#2 楼
您也可以通过inode删除文件:$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete
出于上帝的考虑,无论做什么,都不要在
-delete
之前放置-inum
:$ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$
恭喜,您刚刚删除了所有文件。使用
find
时,参数顺序很重要!评论
为什么不将-delete放在-inum前面呢?这是否只是一种预防措施,以防您过早按Enter或参数的顺序实际上影响结果?
– Detuur
18年1月22日在15:55
@detuur:顺序会影响结果。参见编辑。
–主教
18年1月22日在16:03
在运行不带-delete的命令以检查其是否在查找所需内容之前,请勿在命令段中放入-delete。
–卡兹
18年1月23日在2:36
@Kaz在命令中心添加-delete将无济于事
–RiaD
18年1月23日在12:44
@Kaz使用-print而不是-delete进行了很好的测试。
– Mark Ransom
18年1月25日在4:43
#3 楼
另一种选择是使用rm -ri ./*
; rm
会在删除任何文件和目录之前询问您,因此您只需将y
回复到“坏”文件,并将n
回复给其他所有文件。实际上,在您这种情况下,您甚至可以缩减做
rm -ri ./?
所需的回复数,因为您的“坏”文件只有一个字符长。评论
在?中选择f;做rm -i“ $ f”;打破; “完成”具有-i的所有优点,而不必为导致不良后果回答“否”或对要保留的错误回答“是”的痛苦。
–主教
18-1-22在3:35
对于OP,它是目录,而不是文件。 rmdir?/将删除所有空的单字符目录,并抱怨其他目录不是空的。
– Peter Cordes
18年1月22日在5:30
@bishop:哇,我什至不知道select是否存在,非常干净!
–意大利Matteo
18年1月22日在6:48
@PeterCordes:糟糕,我没有注意到我们在谈论目录。我在示例中添加了-r(和./-总是很容易忘记),因为不幸的是rmdir不支持-i标志。我仍然认为,在这种情况下,最好的方法是结合主教的意见和您的评论。
–意大利Matteo
18年1月22日在6:53
@MatteoItalia select仅存在于某些外壳中,这可能就是为什么您没有遇到它的原因-本来可以移植的脚本和解决方案避免了它,因此我们不太可能在野外看到它。
–mtraceur
18年1月22日在22:15
#4 楼
一种选择是使用ls
以外的名称查找文件名。如果您知道它是由逐字Ctrl + C产生的,则可以找到使用控制字符表或更友好的界面(如Python提供的界面)产生的ASCII字符:>>> import os
>>> os.listdir('.')
['\x03', ...]
另一个选择是使用例如,查看
ls
输出的十六进制转储hexdump
。然后您可以使用此bash命令删除文件,例如:
rmdir "$(printf '\x03')"
(仅在以下情况下需要双引号:您要打印的字符在您的
IFS
变量中,例如\x20
或\x0A
,但这是引用命令替换的好习惯,除非您知道要外壳程序执行字段拆分等。)评论
cat -v(加上man ascii)也可以为第一部分提供帮助。
–意大利Matteo
18年1月21日在20:20
...或者直接从Python Shell使用os.rmdir('\ x03')。
– moooeeeep
18年1月22日在7:56
#5 楼
通常在这种情况下,很容易想出与相关文件匹配的通配符模式。在您的情况下,这就是
?
(将所有文件名精确匹配一个字符)。 只需检查它是否确实符合您想要的内容:
ls -ld ?
,然后删除目录:
rmdir ?
您还可以将其与制表符补全结合使用。您可以输入
rmdir ?
并按Tab键,例如在bash中将被替换为
rmdir ^C/
,然后您可以按Enter键,它会做您想要的事情。
#6 楼
您可以使用Midnight Commander(mc)删除文件-只需使用向上/向下按钮进行选择,然后按F8键。当文件名由于编码而出现奇怪字符时,我偶尔会这样做。
评论
或几乎任何其他文件管理器。
– Stig Hemmer
18年1月22日在10:42
@StigHemmer当然,在显示某些文件名时,某些文件比其他文件做得更好。答案也许可以解释为什么与少数其他选择相比,MC是最佳选择。我不知道,因为我从未使用过它。
–can-ned_food
18年1月28日在6:21
#7 楼
另一种方法:使用stat
来获取目录名称的转义表示:$ stat *|grep File:
File: ‘$ rmdir -v "$(printf '$ rmdir -v $'q4312078q3'
rmdir: removing directory, ‘q4312078q3’
3')"
rmdir: removing directory, ‘q4312078q3’
3’
现在您知道了文件名的表示,因此可以通过以下方式删除文件:使用
printf
命名:q4312078q
或者,如果您正在使用bash,则可以避免使用
printf
:q4312078q
评论
顺便说一句,如果外壳是bash,则$'\ x03'比调用printf更简单。 FreeBSD sh也是如此,它通过POSIX shell扩展并具有一些不错的功能。
– Netch
18年1月28日在8:19
@netch关于bash的$'...'的好处,但是我通常会避免从八进制到十六进制的无用转换。例如。如果文件名为“ \ 111”(在统计信息输出中)怎么办?您还会使用$'\ x49'删除它吗?最好使用与stat相同的顺序:在OP的情况下,rmdir $'\ 003'。
–俄罗斯
18年1月28日在8:27
#8 楼
一个对我有用的解决方案是:rm ./[Tab][Tab][Tab]...
循环浏览可用文件,直到找到要删除的文件。
但是您确实需要在shell中具有必要的设置才能使其正常工作。
评论
^ C确实在制表符序列中处于早期位置,因此为您+1。
– joshudson
18年1月23日在23:49
#9 楼
最简单的方法是将所有内容移至临时目录,然后移至rm -r DIRNAME
。评论
对您来说,这真的比接受的答案容易吗?
–小鸡
18年1月21日在18:27
@chicks:这实际上不是一个糟糕的答案。我已经看到^ V ^ C不起作用,所以有人可能会卡住。
– joshudson
18年1月21日在19:13
本身并没有错,但是与更直接的解决方案相比,这似乎是很多额外的工作。也许我被Linux宠坏了,但是^ v多年来一直为我工作。
–小鸡
18年1月21日在20:28
@chicks ^ V需要一些特定的知识,而移动文件和删除父目录可以从基础知识中获得。
–康提巴斯
18年1月21日在20:52
Ctrl + V可能会因您的实际工作环境而模棱两可,有些终端仿真器可能会将其解释为粘贴。如果粘贴缓冲区包含您不想删除的内容的名称-以及换行符,则可能是您遇到了问题。
–rackandboneman
18年1月22日在6:35
#10 楼
如果它是唯一的空目录(或者您不关心删除其他空目录),请使用rmdir */
。您将从rmdir
收到有关无法删除非空目录的错误消息,但这很好。 GNU rmdir
支持--ignore-fail-on-non-empty
,或者也可以2>/dev/null
。后缀
/
使glob仅匹配目录名称。您可以提前检查当前目录下存在哪些空目录。一个使用
find -maxdepth 1 -type d -empty -ls
。 (并且您可以根据需要将-ls
更改为-delete
。)您可以使用更特定的glob表达式(例如
rmdir [^A-Za-z0-9._]/
)来匹配以非字母数字或下划线文件名开头的目录。我还包括了.
,但是全局表达式通常还是不匹配.
。正如其他人指出的那样,您可以将其限制为
?
的单字符名称:rmdir ?/
rmdir
没有-i
那样的rm
选项,大概是因为空目录通常没有价值,只能重新创建。评论
您想知道要重新创建的目录,并且rmdir可以告诉您是否将-v选项传递给它(至少在GNU中)。
–俄罗斯
18年1月22日在12:09
@Ruslan:如果您不再需要其他过时的目录,则不会,删除它们将是一个好处。您可以使用find -maxdepth 1 -type d -empty -ls查找空目录
– Peter Cordes
18年1月22日在12:59
#11 楼
在做任何有风险的操作之前,请先尝试以下操作:rmdir -- ^C
通常来说,它是一个分隔符,告诉命令将不执行-o选项,但也可能会引起怪异
另一个用法示例是
whois -r -- "-r OBJECT-RIPE"
(-r是成熟的快捷方式,但成熟时who也是参数)
如果初次尝试不起作用,则可以尝试
rmdir -- "^C"
但是在我的csh shell上我不需要它,只是
rmdir ^C
已经对我有用。 br />评论
在csh中键入rmdir后跟
–Mausy5043
18年1月24日在17:01
的确会。请参阅有关如何在命令行上输入^ C字符的公认答案。
–艾尔
18年1月26日在20:54
评论
dsw没有进入POSIX是很糟糕的。@MarkPlotnick:太糟糕了,原始dsw没能进入POSIX。
我认为您没有将其命名为ctrl + C,而是以映射到该键盘快捷键(即ETX(ASCII 3))的ASCII字符命名的。您的控制台字体没有针对该字符的字形,因此它使用通用替换字形“?”。
emacs -nw -f dired提供目录导航器。 D 确认后删除光标下的文件。
@MatteoItalia文件名中的控制字符太糟糕了,其他愚蠢的想法使它成为了POSIX ...