如何在fish shell中递归删除非MP3文件?
如何在fish shell中递归删除非MP3文件?
嘿,我注意到你尝试用rm | ls -R | grep -v "*.mp3"来删除非MP3文件,但这个命令其实逻辑不对——管道顺序搞反了,而且rm默认不会读取标准输入的内容来执行删除,所以这个命令不仅起不到作用,还可能引发错误。咱们先明确你的目录结构:
/Music |--- folder1 |--- folder2 |--- folder3 | |---- folder3.1 | |---- folder3.2 | \---- folder3.3 |--- folder4
下面给你两种在fish shell里安全递归删除非MP3文件的方法:
方法一:使用find命令(通用且安全)
find命令是处理递归文件操作的经典工具,在fish里也能直接使用。你可以先运行不带删除参数的命令,确认要删除的文件列表:
find /Music -type f ! -name "*.mp3"
如果列表符合你的预期,再加上-delete参数执行删除:
find /Music -type f ! -name "*.mp3" -delete
参数解释:
-type f:只匹配文件(排除目录)! -name "*.mp3":排除所有后缀为.mp3的文件-delete:删除匹配到的文件
方法二:利用fish的递归glob特性
fish shell支持**作为递归匹配所有子目录的通配符,结合!(mp3)的否定匹配语法,可以直接构造要删除的文件路径:
先执行echo命令确认文件列表:
echo /Music/**/*.!(mp3)
确认无误后,执行删除:
rm /Music/**/*.!(mp3)
这个方法更简洁,是fish特有的便捷写法。
重要提醒
不管用哪种方法,一定要先运行不带删除操作的命令,确认要删除的文件列表正确,避免误删重要文件。
备注:内容来源于stack exchange,提问作者Leo_2233
相关产品推荐
相关产品推荐

