Mau*_*043 128 freebsd filesystems
我打错字了:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
Run Code Online (Sandbox Code Playgroud)
现在我有一个名为 ^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
Run Code Online (Sandbox Code Playgroud)
和
% ls -i
3611537 ? 3611534 bin
Run Code Online (Sandbox Code Playgroud)
我想删除这个文件。我尝试mv使用 tab-completion 时它显示我:
% mv
^C/ bin/
Run Code Online (Sandbox Code Playgroud)
显然我不能输入 ^C :-/ 如何删除这个文件?
Håk*_*ist 191
^V( ctrl+ v) 用作下一次按键的一种转义序列,插入关联的值而不是采取通常关联的任何操作。
利用这个,^V^C( ctrl+ v, ctrl+ c) 应该可以在终端中输入您的困难文件名。
bis*_*hop 90
您也可以通过 inode 删除文件:
$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete
Run Code Online (Sandbox Code Playgroud)
不管你做什么,偏偏,不要把-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
$
Run Code Online (Sandbox Code Playgroud)
恭喜,您刚刚清除了所有文件。随着find,参数顺序很重要!
Mat*_*lia 32
另一种选择是使用rm -ri ./*; rm在删除任何文件和目录之前会询问您,因此您只需要回复y“坏”文件以及n所有其他文件。
实际上,在您的情况下,您甚至可以通过执行 减少所需的回复数量rm -ri ./?,因为您的“坏”文件只有一个字符长。
Jak*_*kob 23
一种选择是使用除ls. 如果您知道它是由逐字Ctrl+ 生成的C,您可以找到使用控制字符表生成的 ASCII字符,或者使用更友好的界面(如 Python 提供的界面):
>>> import os
>>> os.listdir('.')
['\x03', ...]
Run Code Online (Sandbox Code Playgroud)
另一种选择是查看 的输出的十六进制转储ls,例如使用hexdump.
然后你可以使用(例如)这个 bash 命令删除文件:
rmdir "$(printf '\x03')"
Run Code Online (Sandbox Code Playgroud)
(仅当您尝试打印的字符在您的IFS变量中时才需要双引号,例如\x20or \x0A,但引用命令替换是一个好习惯,除非您知道您希望 shell 执行字段拆分等。)
Juk*_*ela 15
通常在这种情况下,很容易想出与相关文件匹配的通配符模式。
在您的情况下,这很简单?(将所有文件名与精确的一个字符匹配)。
只需检查它是否真的符合您的要求:
ls -ld ?
Run Code Online (Sandbox Code Playgroud)
然后删除目录:
rmdir ?
Run Code Online (Sandbox Code Playgroud)
您还可以将其与选项卡完成相结合。你可以输入
rmdir ?
Run Code Online (Sandbox Code Playgroud)
并按 Tab 键,例如在 bash 中,它将被替换为
rmdir ^C/
Run Code Online (Sandbox Code Playgroud)
然后你可以按回车键,它会做你想做的事。
小智 11
您可以使用 Midnight Commander (mc) 删除文件 - 只需使用向上/向下按钮选择并按 F8。
当文件名由于编码而具有奇怪的字符时,我偶尔会这样做。
另一种方法:用于stat获取目录名称的转义表示:
$ stat *|grep File:
File: ‘\003’
Run Code Online (Sandbox Code Playgroud)
现在您知道文件名的表示形式,因此您可以使用printf以下命令按名称删除文件:
$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用 bash,则可以避免printf:
$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’
Run Code Online (Sandbox Code Playgroud)
对我有用的解决方案是:
rm ./[Tab][Tab][Tab]...
Run Code Online (Sandbox Code Playgroud)
循环浏览可用文件,直到找到要删除的文件。
但是您确实需要在 shell 中进行必要的设置才能使其工作。
最简单的方法是将所有内容移动到临时目录,然后rm -r DIRNAME.