有没有一种简单的方法来评估rm
当您不理解给定命令时(例如无法识别标志、变量等如何交互),它会做什么?
虽然ls
有助于发现rm
参数中的问题,ls -abc XYZ
但不会列出可能受rm -abc XYZ
. 理想情况下,我想输入类似的内容previewrm -abc XYZ
并查看将删除的内容而不实际删除任何内容,包括使用-f
标志。
我基本上想rm
在测试批处理模式下运行。也就是说,我想看看如果真正运行它会采取什么行动,最好根本不接触它。因此,testout 'rm -abc XYZ'
可能是真正的理想。
ori*_*ion 33
您可能rm -i
会收到将删除的每个文件的提示。您可以no
重复使用该yes
命令(令人困惑地)通过管道输入它,以查看提示(拒绝所有提示):
yes no | rm -i files/globs/options
Run Code Online (Sandbox Code Playgroud)
编辑以回应@user63051 的评论
如果您担心危险的标志组合,您可以指定
rm -i --
,之后的任何内容都不会被视为选项。这当然意味着要使-r
标志起作用,您需要将它放在--
.
如果您想尝试,另一个建议是创建一个dummy
不属于任何现有组的用户。如果others
您的文件的权限不包含write
权限(通常不包含,除非您特别需要),您只需以其他用户 ( su dummy
) 的身份登录并执行rm
命令即可。它没有删除任何东西的权限,所以它只会抱怨它。您也可以这样做以使用上述建议(作为双重保护)。
我应该警告你,所有调用的选项rm
都有点危险。我通常只是在我想运行的整个命令前加上前缀echo
,看看 bash 会给命令提供什么参数(它如何扩展通配符以及它找到哪些文件)。然后,echo
如果一切正常,就删除。请注意,这不会列出递归找到的文件的内容,-r
但您会看到它想要销毁的目录。
本质上 -echo
如果您想看看它的作用,请使用。使用--
保护从失控的标志。使用-i
以防万一,它会询问每一个文件,如果它要求你不想删除的东西,你会发现。只有当你真的想生成一个列表,每行一个文件时,做其他任何事情都是有意义的。
在简单的方法是使用rm -i
@orion描述的方式。如果你想要的东西,就不会删除任何东西,但不会调整RM的标志,你总是可以建立自己的版本中rm
,我们叫它preview-rm
。这真的非常简单,您甚至可以在不接触实际rm
源文件的情况下完成:
查找您系统版本的源rm
。您可能需要下载源包或其他任何东西。GNUrm
是“核心实用程序”的一部分,由两个 C 文件、rm.c
和remove.c
和几个头文件组成。一旦您设置好编译系统实用程序,剩下的就很简单了。
创建mockrm.c
包含以下内容的文件。唯一重要的部分是某些版本的rm
目录通过尝试unlink()
和检查错误来检测目录,因此我们需要确保它正常工作:
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
int unlink(char *s)
{
struct stat sbuf;
lstat(s, &sbuf);
/* Simulate unlink error if we're asked to unlink a directory. */
if (S_ISDIR(sbuf.st_mode)) {
return EISDIR;
}
puts(s);
return 0;
}
int rmdir(char *d)
{
printf("%s (dir)\n", d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)最后,preview-rm
像这样编译你的可执行文件:
% cc rm.c remove.c mockrm.c -o preview-rm
Run Code Online (Sandbox Code Playgroud)
中的函数mockrm.c
将优先链接到 C 库提供的系统调用,为您提供rm
可用于预览的无齿克隆。(在将它指向重要文件之前,请测试它是否真的有效。)
替代方案:如果您在支持该LD_PRELOAD
功能的系统上(OS X 不支持),您可以通过将mockrm.c编译到共享库 ( .so
) 并强制它由真实加载来获得相同的效果rm
:
% cc rm.c remove.c mockrm.c -o preview-rm
Run Code Online (Sandbox Code Playgroud)
但是既然您无论如何都需要更改命令调用,为什么不创建一个单独的可执行文件,如上所示。我知道将真实rm
文件指向有价值的文件会有点紧张(编辑:如果你更新你的操作系统,你必须再次测试并确保rm
没有以禁用包装器的方式改变。)
小智 5
当我想这样做时,我使用“find”作为 rm 的包装器。这更好(对于您想到的用例),因为:
要列出您可能想要删除的文件:
find . -name \*.tmp
Run Code Online (Sandbox Code Playgroud)
预览删除:
find . -name \*.tmp -exec echo rm \{\} +
Run Code Online (Sandbox Code Playgroud)
要真正删除它们,只需删除“回声”:
find . -name \*.tmp -exec rm \{\} +
Run Code Online (Sandbox Code Playgroud)
或者,您可以执行更高级的搜索/删除命令,例如:
find . \( -name \*.tmp -o -iname cache -o -iname temp \) -exec rm \{\} +
Run Code Online (Sandbox Code Playgroud)
您也可以将 find 的输出通过管道传输到“xargs rm”,但使用 NUL 来分隔文件名,如下所示:
find . -name \*.tmp -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)