Bry*_*ein 428 command-line shell options quoting rm
如何删除文件名以破折号(连字符或减号)开头的文件-?我通过 ssh 连接到远程 OSX 服务器,并且我的目录中有这个文件:
tohru:~ $ ls -l
total 8
-rw-r--r-- 1 me staff 1352 Aug 18 14:33 --help
...
Run Code Online (Sandbox Code Playgroud)
我怎么--help能从 CLI 中删除?这个问题是我偶尔以不同形式遇到的问题,这些文件很容易创建,但很难摆脱。
我试过使用反斜杠
rm \-\-help
Run Code Online (Sandbox Code Playgroud)
我试过引号
rm "--help"
Run Code Online (Sandbox Code Playgroud)
如何防止将减号(破折号或连字符)字符解释为选项?
小智 640
使用“--”使 rm 停止解析命令行选项,如下所示:
rm -- --help
Run Code Online (Sandbox Code Playgroud)
小智 260
或者你可以做
rm ./--help
Run Code Online (Sandbox Code Playgroud)
acu*_*ich 43
用find它来做:
find . -name '--help' -delete
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法,因为如果您有更多这样的文件可以删除,您可以通过简单地运行 find 而不带-delete选项来获得文件的预览列表,然后如果文件列表看起来不错就运行它再次与-delete。
事实上,你避免rm赞成find(尤其是先预览)是一个好习惯,它可以帮助你避免错误,rm *因为它会不可避免地在某一天咬你。
但是请注意,该 find 将遍历您的所有子目录,因此您可能希望使用子目录深度约束来运行它,如下所示:
find . -maxdepth 1 -name '--help' -delete
Run Code Online (Sandbox Code Playgroud)
这将查找限制为当前目录。
Bal*_*dur 21
Vegar Nilsen 和 edfuh 的答案非常好,是解决此类问题的正确方法。
我确实想对这个问题添加一个一般性回答,允许您删除任何文件名较难的文件。首先使用ls -i或 某种形式获取其 inode 编号stat,然后通过按 inode 编号搜索当前目录中rm的文件并对具有匹配 inode 编号的文件执行命令来删除文件
find . -inode <inode> -exec rm {}\;
Run Code Online (Sandbox Code Playgroud)
由于 inode 编号在每个文件系统中都是唯一的,因此您可以使用它删除任何文件;unicode 或使用转义字符。打字非常烦人,所以我建议添加该行
TAB: menu-complete # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards
Run Code Online (Sandbox Code Playgroud)
.inputrc如果您使用 bash,请进入您的文件。这允许您循环浏览可能完成的列表(以获取更多信息)。
小智 11
一个残酷的解决方案:
perl -e "unlink '--help' or die 'Could not unlink.';"
perl -e "rmdir '-d' or die 'Could not rmdir.';"
Run Code Online (Sandbox Code Playgroud)
创建带有破折号和空格的文件,然后将其删除的 Linux 演练。
当心!不要意外运行rm -rf /或类似的级联删除命令。
如果您尝试删除的文件包含星号或斜杠,请不要意外使用.或/*或*其他通配符,这可能会级联删除您的操作系统。
创建一个名为“--yo yo”的文件
eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin --yo yo
Run Code Online (Sandbox Code Playgroud)
首先,使用 find 找到它:
eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo
Run Code Online (Sandbox Code Playgroud)
确保 find 命令只找到您要删除的 ONE 文件:
然后通过 -delete 选项查找,删除它们:
eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin
Run Code Online (Sandbox Code Playgroud)
Aaaand它不见了。
| 归档时间: |
|
| 查看次数: |
181294 次 |
| 最近记录: |