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


13

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

请问会rm wordpress-*.sql不会成功,还是会从子目录中删除匹配项?


1
顺便说一句,尽管所有其他答案都正确无误,但还有一个变数:实际上,bash而不是rm命令扩展了通配符。如果您的目录中有十个匹配的文件,则rm将不会看到通配符,而是会看到十个单独的参数。如果要rm进行扩展,则必须将参数用单引号引起来。对于rm,这没有什么区别,但是在其他情况下却可以。通常,当通配符引用文件以外的其他内容时,例如apt-get软件包。
凯文·基恩

3
@KevinKeane,rm不进行文件名扩展... rm "foo*"将尝试删除名称中带有文字星号的文件。
ilkkachu

Answers:


20

*不会rm。正常的浮动不是递归的,也不是。

如果目录名匹配,它将不会被删除-您需要-r标记来删除目录。

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

您也可以进行rm互动

rm -i wordpress-*.sql

那么它将在删除每个文件之前要求确认


14

是的,它可以为您解决问题,并删除当前目录中具有该模式的所有文件。不,它不会删除子目录中的文件。

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

rm wordpress-*.sql

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

ls wordpress-*.sql

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

当您尝试获取诸如:的列表时foo*,最好使用-dswitch with ls来防止列出名为foobar/etc等目录的文件。

ls -d foo*

此技巧适用于不用于递归执行此任务的命令。

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


4
我最喜欢的方法:printf "%s\n" wordpress-*.sql
wjandrea

1
您也可以假装Echo喜欢echo rm file*。尤其要查找恶意文件名,例如-rf
eckes'May

@eckes:您可以使用rm ./*或来更安全地覆盖这些内容rm -- *
David Foerster

是的,或者使用xargs -0@DavidFoerster
eckes '17

如果你去ls foo*,你有一个名为目录foobar,你也可以得到的该目录的内容列表,所以普通的ls是不是真的到了什么是最好的方式rm将打击
ilkkachu


-1

如果要查找和删除所有匹配的文件(例如)wordpress-*.sql,可以使用findcommand。:)

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

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

只要find程序真正找到匹配的文件,它就会尝试在after -exec选项之后执行命令。在这种情况下,rm -f {}将执行{}并将其更改为匹配文件名。例如

rm -f wordpress-169.sql

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

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

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


1
OP希望相反:不要递归到子目录中。
Melebius

2
GNU发现:“选项影响所有测试,包括在选项之前指定的测试”,下面的选项列表包括-maxdepth。使用-exec rm -f {} +而不是-exec \;,或者更好,只是-delete
ilkkachu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.