AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 893343
Accepted
Mausy5043
Mausy5043
Asked: 2018-01-22 07:55:11 +0800 CST2018-01-22 07:55:11 +0800 CST 2018-01-22 07:55:11 +0800 CST

FreeBSD:目录名为 ^C(真的!) - 如何删除?

  • 772

我打错了:

$ 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 :-/ 如何删除这个文件?

filesystems
  • 11 11 个回答
  • 17814 Views

11 个回答

  • Voted
  1. Best Answer
    Håkan Lindqvist
    2018-01-22T08:23:05+08:002018-01-22T08:23:05+08:00

    ^V( ctrl+ v) 用作下一次按键的一种转义序列,插入关联的值,而不是采取通常关联的任何操作。

    利用这一点,^V^C( ctrl+ v, ctrl+ c) 应该可以在终端中输入您的困难文件名。

    • 191
  2. bishop
    2018-01-22T19:42:25+08:002018-01-22T19:42:25+08:00

    您也可以通过 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,参数顺序很重要!

    • 91
  3. Matteo Italia
    2018-01-22T12:13:01+08:002018-01-22T12:13:01+08:00

    另一种选择是使用rm -ri ./*; rm在删除任何文件和目录之前会询问您,因此您只需回复y“坏”文件以及n所有其他文件。

    实际上,在您的情况下,您甚至可以减少所需的回复数量rm -ri ./?,因为您的“坏”文件只有一个字符长。

    • 32
  4. Jakob
    2018-01-22T10:51:39+08:002018-01-22T10:51:39+08:00

    一种选择是使用除ls. 如果您知道它是由逐字生成的Ctrl+生成的,则可以使用控制字符表或使用更友好的界面(如 Python 提供的界面)C找到生成的 ASCII 字符:

    >>> import os
    >>> os.listdir('.')
    ['\x03', ...]
    

    另一种选择是查看 的输出的十六进制转储ls,例如使用hexdump.

    然后,您可以使用(例如)此 bash 命令删除该文件:

    rmdir "$(printf '\x03')"
    

    (仅当您尝试打印的字符在IFS变量中时才需要双引号,例如\x20or \x0A,但引用命令替换是一个好习惯,除非您知道您希望 shell 执行字段拆分等)

    • 23
  5. Jukka Suomela
    2018-01-22T13:02:53+08:002018-01-22T13:02:53+08:00

    通常在这种情况下,很容易想出与相关文件匹配的通配符模式。

    在您的情况下,这很简单?(将所有文件名与一个字符匹配)。

    只需检查它是否真的符合您的要求:

    ls -ld ?
    

    然后删除目录:

    rmdir ?
    

    您也可以将其与制表符完成结合起来。你可以输入

    rmdir ?
    

    并按 Tab,例如在 bash 中,它将被替换为

    rmdir ^C/
    

    然后你可以按回车键,它会做你想做的事。

    • 15
  6. filo
    2018-01-22T12:29:57+08:002018-01-22T12:29:57+08:00

    您可以使用 Midnight Commander (mc) 删除文件 - 只需使用向上/向下按钮选择并按 F8。

    当文件名由于编码而具有奇怪的字符时,我偶尔会这样做。

    • 11
  7. Ruslan
    2018-01-23T02:25:08+08:002018-01-23T02:25:08+08:00

    另一种方式:用于stat获取目录名称的转义表示:

    $ stat *|grep File:
      File: ‘\003’
    

    现在您知道了文件名的表示形式,因此您可以使用以下命令按名称删除文件printf:

    $ rmdir -v "$(printf '\003')"
    rmdir: removing directory, ‘\003’
    

    或者,如果您使用 bash,则可以避免printf:

    $ rmdir -v $'\003'
    rmdir: removing directory, ‘\003’
    
    • 7
  8. joeytwiddle
    2018-01-23T00:31:51+08:002018-01-23T00:31:51+08:00

    对我有用的解决方案是:

    rm ./[Tab][Tab][Tab]...
    

    循环浏览可用文件,直到找到要删除的文件。

    但是您确实需要在 shell 中进行必要的设置才能使其正常工作。

    • 6
  9. Kondybas
    2018-01-22T08:31:50+08:002018-01-22T08:31:50+08:00

    最简单的方法是将所有内容移动到临时目录,然后rm -r DIRNAME.

    • 5
  10. Peter Cordes
    2018-01-22T21:39:44+08:002018-01-22T21:39:44+08:00

    如果它是唯一的空目录(或者您不关心删除其他空目录),请使用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,大概是因为空目录通常没有价值,只能重新创建。

    • 1

相关问题

  • 我如何知道 AIX 中磁盘上的文件系统是什么?

  • 控制 UNIX 目录内容用户组所有权

  • 在 Ubuntu 上将 Windows 磁盘分区与 Linux 分区合并

  • 在 VMPlayer 上 Windows 和 Linux 之间共享目录的最佳方式

  • md5sum 重复为同一台机器上的同一文件提供不同的校验和

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve