删除名为 '.env'$'\r' 的文件

Def*_*Day 16 filenames rm delete

我不知道是什么创建了这个文件 - 我猜是一个糟糕的 shell 脚本。

它被称为'.env'$'\r'

我尝试过各种版本的,以及使用 打开目录、选择文件和 Shift-D 进行删除的rm技术。 这不起作用,失败了vim ./

**warning** (netrw) delete(/root/squawker/.env) failed!
NetrwMessage [RO]
"NetrwMessage"  --No lines in buffer--
Run Code Online (Sandbox Code Playgroud)

我怎样才能删除这个讨厌的文件?

这是在 Ubuntu 20.04 上

ilk*_*chu 23

在最近的 Linux 系统上(与大多数桌面发行版一样使用 GNU 工具),ls使用 shell 的引用语法打印带有奇怪字符的名称。如果'.env'$'\r'是这样ls,则文件名是.env<CR>,其中<CR>回车符是。如果您有一个带有 Windows 行结尾的 shell 脚本,运行例如whatever > .env.

这里的好处是ls那里的输出可以直接用作 shell 的输入。嗯,至少对于 Bash、ksh 和 zsh 来说,不是标准的 POSIX sh,比如 Debian/Ubuntu 的/bin/shDash。

所以尝试只用

rm -f '.env'$'\r'
Run Code Online (Sandbox Code Playgroud)

当然rm -f .env?,还应该努力删除任何名为.env加任何一个字符的内容。

现在,当然,文件名也可能是字面意思,带有单引号和反斜杠。但这更难偶然实现。即便如此,rm -f *.env*应该努力删除.env名称中包含的任何内容。

  • `$'.env\r'` 将是一种更清晰/更易读的编写方式,整个内容都在 C 转义扩展引号内。哦,但不幸的是,如果我先“触摸”该文件名,这就是“ls --quoting-style=shell-escape .env*”打印它的方式。正如另一个答案指出的那样,这看起来像是“rm -i .env?”或“.env*”的一个很好的用例。 (3认同)
  • 请注意,这是“ls”的 GNU 实现的行为,与 Linux 无关。 (2认同)

Nas*_*ley 23

如果使用 GNU find,那么您可以通过 inode 删除它。

ls -lid -- .env*
Run Code Online (Sandbox Code Playgroud)

第一列中的数字是inodeenv如果文件名中包含该字符串的其他文件存在,请注意您实际想要的文件是什么。

find . -inum <inode> -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

替换<inode>为实际的索引节点号。您可以删除该-exec部分,以便在删除它之前知道它正在返回您想要的文件。

您还可以使用:

find . -inum <inode> -delete
Run Code Online (Sandbox Code Playgroud)

我有时会-exec出于习惯使用这一点,但其中任何一个都有效。

  • `*env*` 扩展不会包含 OP 的 `.env&lt;CR&gt;` 文件,尽管它是一个隐藏文件。 (4认同)

Pau*_*ant 13

要求 shell 对名称中棘手的部分使用通配符,并要求rm为您记住它,这样您就不需要键入它。

$ touch '.env'$'\r'
$ ls -l .env*
-rw-rw-r-- 1 paul paul 0 May 20 16:51 '.env'$'\r'
$ rm -i .env*
rm: remove regular empty file '.env'$'\r'? y
Run Code Online (Sandbox Code Playgroud)


dr_*_*dr_ 11

选择讨厌的文件名的一种快速而肮脏的方法是使用 shell 的自动完成功能。

键入rm ,然后按 TAB 键,直到屏幕上打印出要删除的文件。

  • 哪个shell,怎么配置? (3认同)
  • zsh 会在匹配的之间轮换,但我不认为 Bash 可以做到这一点。因此,如果只有一个这样开头的文件名,则“.env&lt;tab&gt;”可以在 Bash 中工作。但如果例如 `.env` 也存在,那么完成并没有真正的帮助。 (2认同)