“rm files*” 是否会从所有子目录中删除所有匹配项?

“rm files*” 是否会从所有子目录中删除所有匹配项?

我想删除任何看起来像wordpress-891.sql来自当前目录(不在子目录内)的文件。

这会rm wordpress-*.sql起到作用吗?还是也会从子目录中删除匹配项?

答案1

不,正常的通配符*不是递归的,也不是rm

如果目录名称匹配,则不会删除它 - 您需要标志-r来删除目录。

因此,如果您确定要删除这些文件,那么这样做是安全的。

您还可以进行rm互动

rm -i wordpress-*.sql

然后它会在删除每个文件之前要求确认

答案2

是的,它确实帮你解决了这个问题,删除了当前目录中所有具有该架构的文件。不,它不会删除子目录中的文件。

当您运行以下命令时,您不确定会发生什么:

rm wordpress-*.sql

然后使用以下命令运行它ls

ls wordpress-*.sql

您在输出中看到的文件就是将被删除的文件。

当您尝试获取类似这样的列表时:foo*最好使用-d开关来ls防止列出名为foobar/etc的目录中的文件。

ls -d foo*

此技巧适用于不用于递归执行作业的命令。

您可以做的另一件事是键入所需的输入,例如:wordpress-*然后按Ctrl+ Alt+ *,现在所有匹配项都会自动输入在您的命令前面。

答案3

不,rm不会通过子目录进行递归。

删除所有子目录中匹配的文件 - SuperUser了解删除子目录中文件的方法。

如果您担心意外删除重要内容,请使用gvfs-trash(将文件发送到垃圾箱)而不是rm(永久删除文件)。

答案4

如果您想查找并删除所有匹配的文件(例如)wordpress-*.sql,您可以使用find命令。:)

例如,您想删除所有与 匹配的文件wordpress-*.sqltest_dir请执行以下操作。

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

每当find程序真正找到匹配的文件时,它都会尝试执行选项后面的命令-exec。在这种情况下,rm -f {}将被执行并{}更改为匹配文件名。例如

rm -f wordpress-169.sql

您还可以使用选项设置子目录的深度-maxdepth

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

请注意,您必须-maxdepth在其他选项之前指定选项。否则您可能会遇到您不想看到的结果。

相关内容