如何删除文件名包含非打印字符的文件

Mr *_*ose 52 special-characters filenames rm

我以某种方式设法创建了一个似乎没有文件名的文件。我在以下线程中找到了一些有关如何获取文件的更多详细信息的信息

但是,我尝试了列出的一些建议,但似乎无法删除该文件。我不确定我做了什么来创建它,但是在尝试复制 xml 文件时发生了。

该文件的一些信息如下;

> ls -lb
total 296
-rw-r--r--   1 voyager  endeavor  137627 Jan 12 12:49 \177

> file *
:               XML document

> ls -i
 417777   
Run Code Online (Sandbox Code Playgroud)

我试图找到使用 inum 开关,然后将其通过管道传递给 rm,因为这似乎是摆脱它的最简单的方法。但是,下面链接的线程底部给出的示例对我来说失败了。例子是:

> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
Run Code Online (Sandbox Code Playgroud)

所以我首先尝试使用路径列表,如下所示,但这也不起作用:

> find . -inum 41777 -exec ls -al {} \;
Run Code Online (Sandbox Code Playgroud)

我不确定不可打印的字符 \177 是什么,或者我如何将它传递给rm命令,但我真的想确保我在尝试删除此文件时不会弄乱任何其他文件/目录。

ant*_*e-m 52

该文件有一个名称,但它由不可打印的字符组成。如果您使用 ksh93、bash、zsh、mksh 或 FreeBSD sh,您可以尝试通过指定其不可打印名称来删除它。首先确保名称正确:ls -ld $'\177' 如果显示正确的文件,则使用 rm:rm $'\177'

另一种(风险更大的)方法是使用rm -i -- *. 使用 -i 选项 rm 在删除文件之前需要确认,因此您可以跳过所有要保留的文件,但只有一个。

祝你好运!

  • @KeithThompson:shell 中的全局扩展不受进一步解释的影响。除非包含换行符,否则扩展名中不会有换行符。 (7认同)

小智 27

对于那些使用vim在当前工作目录中运行它的人:

$ vim ./ 
Run Code Online (Sandbox Code Playgroud)

并使用箭头键或 导航到该文件j/k。然后点击Shift+D并确认删除y


Mic*_*zek 9

可能有一种方法可以将文件名传递给rm,但是如果您担心弄乱任何东西,您可以使用 GUI 文件管理器。Emacs 附带了一个目录编辑模式,如果你安装了它,你可以使用它:

  1. 中打开文件夹emacs。可以运行emacs /path/to/folder,或者打开emacs,点击Esc+ x,然后运行dired,会提示输入路径

    http://so.mrozekma.com/unix-dired-delete1.png

  2. 移动到要删除的文件所在的行,然后按d。您应该D在文件旁边的左边距中看到一个:

    http://so.mrozekma.com/unix-dired-delete2.png

  3. x保存更改。它会提示您确定要删除该文件;按y

    http://so.mrozekma.com/unix-dired-delete3.png

  • 对于那些使用 `vim` 的人,在当前工作目录中运行它:`vim ./` 并使用箭头键导航到该文件。然后按“Shift+D”并用“y”确认删除。 (2认同)

Gil*_*il' 9

该文件实际上有一个名称,但它由不可打印的字符组成。

一个简单的方法是依靠 shell 补全:Tab反复按直到插入“奇怪”的文件名。您必须将 shell 配置为在可能的完成之间循环:

  • 在 bash 中,您需要调用menu-complete默认未绑定的 ,而不是默认complete绑定Tab的 。或者,使用Esc *为所有文件插入补全,并从命令行中删除您不想删除的补全。
  • 在zsh中,默认设置就可以了;你需要拥有setopt auto_menusetopt menu_complete设置。

如果完成在您的 shell 中没有帮助,您可以调用rm -i -- *并回答“否”,除了这个特定文件。如果文件名不以可打印字符开头,您可以将匹配限制为第一个字符不在一组可打印字符中的文件:

rm -i [!!-~]*
rm -i [![:print:]]*
rm -i -- [!a-z]
Run Code Online (Sandbox Code Playgroud)

(请注意您的模式是否可能与名为 的文件匹配-f,这rm将被视为一个选项。)

另一种方法是调用ls -i以查找文件的 inode(一个 inode 唯一标识给定文件系统上的文件),然后find -inum对该特定文件进行操作。当目录包含大量文件时,此方法最有用。

ls -i
# note the inode number 12345
find . -xdev -inum 12345 -delete
Run Code Online (Sandbox Code Playgroud)

如果您find没有-delete选择,请致电rm

find . -xdev -inum 12345 -exec rm -- {} \;
Run Code Online (Sandbox Code Playgroud)

(是的,我知道大部分内容已经发布。但是相关信息的答案使这变得比应该的更复杂。)


phe*_*mer 8

你已经证明file *了 shell glob ( *) 能够获取这个文件,所以现在只需rm在那个 glob 上做一个。

  • 切换到文件所在的目录。
  • rm -i *
  • 输入n所有文件,但文件名看似不可见的文件除外