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

时间:2018-12-12 02:01:45

标签: bash file-management file-manipulation

很难解释,但我正在寻找一个相对简单的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命令,但是无法确定如何识别正在查看的文件是否匹配。老实说,我没有做太多尝试,因为我什至都没有想到从哪里开始。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

因此,结果是循环遍历当前目录中的文件,跳过以.mp4结尾的文件,查找成对或匹配的.mp4文件,并删除没有匹配的{{1 }}。

答案 1 :(得分:0)

您可以这样做:

#!/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的文件名是否存在