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 在删除文件之前需要确认,因此您可以跳过所有要保留的文件,但只有一个。
祝你好运!
小智 27
对于那些使用vim
在当前工作目录中运行它的人:
$ vim ./
Run Code Online (Sandbox Code Playgroud)
并使用箭头键或 导航到该文件j/k
。然后点击Shift+D
并确认删除y
。
可能有一种方法可以将文件名传递给rm
,但是如果您担心弄乱任何东西,您可以使用 GUI 文件管理器。Emacs 附带了一个目录编辑模式,如果你安装了它,你可以使用它:
中打开文件夹emacs
。可以运行emacs /path/to/folder
,或者打开emacs,点击Esc+ x,然后运行dired
,会提示输入路径
移动到要删除的文件所在的行,然后按d。您应该D
在文件旁边的左边距中看到一个:
按x保存更改。它会提示您确定要删除该文件;按y:
该文件实际上有一个名称,但它由不可打印的字符组成。
一个简单的方法是依靠 shell 补全:Tab反复按直到插入“奇怪”的文件名。您必须将 shell 配置为在可能的完成之间循环:
menu-complete
默认未绑定的 ,而不是默认complete
绑定Tab的 。或者,使用Esc *为所有文件插入补全,并从命令行中删除您不想删除的补全。setopt auto_menu
或setopt 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)
(是的,我知道大部分内容已经发布。但是相关信息的答案使这变得比应该的更复杂。)
你已经证明file *
了 shell glob ( *
) 能够获取这个文件,所以现在只需rm
在那个 glob 上做一个。
rm -i *
n
所有文件,但文件名看似不可见的文件除外