我有一个目录,里面有一堆文件扩展名,我想列出一个特定的文件扩展名(可能类似于grep *.mp3
),并在列出时删除它们并输出。我该怎么做,或者如果有重复的,请随时标记我。
例子:
grep "*.mp3" . | rm -fr
答案1
让我们从包含三个文件的目录开始mp3
:
$ ls *mp3
a.mp3 b.mp3 c.mp3
现在,列出要删除的内容并删除它们:
$ find . -maxdepth 1 -name '*.mp3' -printf 'Deleting %p\n' -delete
Deleting ./a.mp3
Deleting ./b.mp3
Deleting ./c.mp3
完成此操作后,mp3
文件就消失了:
$ ls *mp3
ls: cannot access '*mp3': No such file or directory
怎么运行的
`查找。
这将启动一个
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
答案2
你要find
...
find . -type f -iname "*.mp3"
默认情况下,它会递归到子目录,因此如果您获取的文件多于您想要的文件,请添加-maxdepth 1
仅在当前目录中搜索。检查输出是否是您想要删除的内容后,您可以再次执行此操作(谢谢向上箭头...)并添加-delete
。
find . -type f -iname "*.mp3" -delete
.
是当前工作目录 - 如果您不在该目录中,您可以在这里给出该目录的路径......
为了使其具有交互性,您可以使用-exec
定义自己的动作而不是find
的-delete
动作
find . -type f -iname "*.mp3" -exec rm -i -- {} \;
然后它会在删除每个文件之前提示您......
答案3
当您只想删除当前目录中的项目时,使用通配符就足够了,如下所示:
$ ls *.jpeg
birthday2016_001.jpeg birthday2016_002.jpeg birthday2016_003.jpeg
$ rm *.jpeg
$ ls *.jpeg
ls: cannot access '*.jpeg': No such file or directory
如您所见,在上面的示例中,所有带有.jpeg
扩展名的文件都被删除了。列出它们,是同样的想法 -echo *.jpeg
和ls *.jpeg
。因此,您基本上可以简单地ls *.mp3 && rm *.mp3
针对您的情况进行操作
Python替代方案:
就我而言,我正在删除.jpeg
文件,因此根据需要调整下面的代码:
python -c 'import os,sys;[(sys.stdout.write(i + "\n"),os.unlink(i)) for i in os.listdir(".") if i.endswith(".jpeg")]'
示例运行:
$ ls *.jpeg
birthday2016_001.jpeg birthday2016_002.jpeg birthday2016_003.jpeg
$ python -c 'import os,sys;[(sys.stdout.write(i + "\n"),os.unlink(i)) for i in os.listdir(".") if i.endswith(".jpeg")]'
birthday2016_003.jpeg
birthday2016_001.jpeg
birthday2016_002.jpeg
$ ls *.jpeg
ls: cannot access '*.jpeg': No such file or directory