删除在生成输出时过滤的列表

Azk*_*erM 5 command-line files

我有一个混合了一堆文件扩展名的目录,我想列出一个特定的文件扩展名(可能类似于grep *.mp3),并在列出时使用输出删除它们。我该怎么做,或者如果有骗子,请随时标记我。

例子:

grep "*.mp3" . | rm -fr 
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 5

让我们从一个包含三个mp3文件的目录开始:

$ ls *mp3
a.mp3  b.mp3  c.mp3
Run Code Online (Sandbox Code Playgroud)

现在,让我们在列出要删除的内容后删除它们:

$ find . -maxdepth 1 -name '*.mp3' -printf 'Deleting %p\n' -delete
Deleting ./a.mp3
Deleting ./b.mp3
Deleting ./c.mp3
Run Code Online (Sandbox Code Playgroud)

完成后,mp3文件消失了:

$ ls *mp3
ls: cannot access '*mp3': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • `找到。

    这将启动一个find命令。它将在当前目录中查找文件,..

  • -maxdepth 1

    默认情况下,find递归搜索子目录。这告诉它不要那样做。使用-maxdepth 1,该命令find将只查看它在当前目录中找到的内容,而不会探索当前目录的任何子目录。

  • -name '*.mp3'

    这告诉 find 只查找带有.mp3扩展名的文件。

  • -printf 'Deleting %p\n'

    这告诉 find 打印关于找到的每个文件的消息。

    当然,如果您愿意,您可以将其更改为另一条消息。如果您不想要消息,则可以完全省略此选项。

  • -delete

    这告诉 find 删除每个文件。

不区分大小写的搜索

如果您还想查找名为.MP3.Mp3等的文件,那么我们需要不区分大小写的搜索,我们使用-iname

find . -maxdepth 1 -iname '*.mp3' -printf 'Deleting %p\n' -delete
Run Code Online (Sandbox Code Playgroud)