如何删除特定文件夹中具有特定扩展名的所有文件?


36

如果我将当前目录/工作目录(使用导航到它cd)设置为某个特定目录,然后键入:

rm *.xvg

该命令将做什么?这是真的,上面的命令将删除文件扩展名为.xvg 只有在工作目录?

在询问之前,我对此很紧张,因为我想绝对确定上面的命令将只删除位于工作目录中的.xvg文件。

Answers:


34

是的,rm *.xvg在您指定的扩展删除文件当前目录。

确保您确实在要删除文件的目录中的一个方法是使用pwd将显示当前目录的命令,然后执行ls来验证您是否找到了所需的文件。

如果您对发出rm命令有些担心,则可以执行以下两项操作:

  1. 键入ls *.xvg以查看此命令将影响哪些文件的列表。

  2. 除非您有很多文件,否则您总是可以使用-i命令行开关rmcp和和也存在mv)。rm -i *.xvg如果可以删除,则使用会提示您输入每个文件,因此您可以确定没有意外的删除任何文件。(如果您有很多文件,这将很乏味:)


1
另外:rm -f {*.xvg,.*.xvg}还要删除隐藏文件。并rm -R -f {*.xvg,.*.xvg}删除目录。
多尔

20

您无需导航至目录,只需使用

rm /some/dir/*.xvg 

如果路径中有错别字或类似错误,则/ som / dir不存在:

cd /som/dir
rm *.xvg

会意外删除当前目录中的所有.xvg文件。第一个命令不会,并且您不需要再次CD。

另一种方法是使用find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 

找到/ some / dir / -maxdepth 1 -type f -name“ * .xvg”-删除对我有用!如果给定路径,则使用-maxdepth“ n”删除子目录中的匹配文件
Vinay

3

是的,rm *.xvg只会删除.xvg当前目录中以结尾的文件。这就是为什么。

当您键入这样的命令时,工作将在您正在使用的shell(假设bash)和命令二进制文件之间进行分配。

您可以通过键入找到二进制文件which rm。这个小程序负责取消链接文件。这样的程序可以从命令行启动,并且可以prog arg1 arg2 arg3在启动时读取参数列表。对于rm,它们被解释为要删除的标准文件名列表。因此,如果您在包含该文件的目录中foo.bar,则键入delete 'foo.*'将导致rm: foo.*: No such file or directory。注意文件模式周围的单引号,它们告诉Shell将参数原样传递给Shell。

但是,如果您输入rm *.bar相同的目录,它将删除该文件。这里发生的是,您的shell(您用来输入命令的程序)在将参数传递给命令之前正在执行一些转换。其中之一称为“文件名扩展”,否则称为“ globbing”。您可以在此处看到bash文件名扩展的列表。最常见的扩展之一是*,它被扩展为当前目录中的文件名。

查看工作中的glob的一种简单方法是使用echo,它打印回通过外壳传递给它的所有参数。因此echo *,在同一目录中键入将输出foo.bar。因此,当您键入时rm *.bar,实际发生的是外壳将参数列表扩展为foo.bar,然后将其传递给rm命令。

有一些控制globbing的方法。例如,在最新版本的bash中,您可以打开一个名为globstar的选项,它将进行递归扩展。键入echo **/*.bar将显示.bar以所有子文件夹结尾的所有文件的列表。因此,键入rm **/*.bar启用了globstar的bash确实会递归删除子文件夹中的所有匹配文件。


1

命令:

  rm ./*.pgm

为我工作

命令:

rm *.pgm

给出错误命令(波兰语,翻译):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
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.