如何删除没有具有不同扩展名的匹配文件的文件



解释起来有点困难,但我正在寻找一个相对简单的bash脚本,如果找不到与mp4同名的文件,它可以删除文件。

本质上,我有这样的文件:

S01E02 - Name of Episode 2.description
S01E02 - Name of Episode 2.srt
S01E02 - Name of Episode 2.mp4    
S01E03 - Name of Episode 3.description
S01E03 - Name of Episode 3.srt
S01E03 - Name of Episode 3.mp4
S01E04 - Name of Episode 4.description
S01E04 - Name of Episode 4.srt

我试图实现的是获得一个bash脚本设置,它可以搜索文件并删除文件,例如:

S01E04 - Name of Episode 4.description
S01E04 - Name of Episode 4.srt

因为没有匹配的mp4文件

我大约一周前才开始玩bash,所以我相信它比我想象的要容易得多,但我自己就是想不出来。


我曾想过使用for命令,但我无法确定如何识别正在查看的文件是否匹配。老实说,我没有尝试太多,因为我甚至想不出从哪里开始。

提前感谢!

for file in *; do
[[ $file = *.mp4 ]] && continue  # skip .mp4 files
mp4_file=${file%.*}.mp4
[[ -s $mp4_file ]] || rm -f -- "$file"
done

让我们看看这是如何工作的:

  • ${file%.*}是一个参数扩展,它从变量file的末尾剥离与.*匹配的最短字符串。因此,mp4_file具有附加了.mp4的无扩展名
  • test -s "$mp4_file",或者它的现代bash语法替代[[ -s $mp4_file ]],查看这样命名的文件是否存在并且不是空的
  • 当且仅当foo返回布尔值false时,foo || bar执行bar

因此,其效果是循环当前目录中的文件,跳过以.mp4结尾的文件,查找配对或匹配的.mp4文件,并删除未找到匹配.mp4的文件。

你可以这样做:

#!/bin/bash
shopt -s extglob
for f in !(*.mp4)
do
filecheck=$(echo "$f" | cut -f 1 -d '.').mp4
if [ ! -f "${filecheck}" ]; then
rm -- "$filecheck"
fi
done

它只是遍历非.mp4文件的列表,并检查是否存在相同的扩展名为.mp4的文件名

相关内容

  • 没有找到相关文章

最新更新