如何删除孤立文件?

ICD*_*Ppl 4 command-line bash scripts

我想在我的 NAS 上自动清理孤儿字幕文件,该文件为 KODI 提供文件。

当我在 KODI 中删除观看的电视剧集时,它会在目录中保留相应的字幕文件。

我想有一个bash脚本递归去通过电视文件夹并删除字幕文件(.SRT,或有时.xx.srt为不同的语言,其中xx是两个字母的语言代码),它也没有相应的有.mkv、.avi 或 .mp4 文件。

我的文件夹结构如下所示:

-TV
  |-Show 1
  |  |-Season 01
  |  |-Season 02
  |      |-Show 1 S02E01.mkv
  |      |-Show 1 S02E01.srt
  |      |-Show 1 S02E02.avi
  |      |-Show 1 S02E02.srt
  |
  |-Show 2 
  |   |-Season 03
  |       |- Show 2 S03E02.mp4
          |- Show 2 S03E02.en.srt
          |- Show 2 S03E02.sv.srt
Run Code Online (Sandbox Code Playgroud)

删除剧集后,它看起来像这样:

-TV
  |-Show 1
  |  |-Season 01
  |  |-Season 02
  |      |-Show 1 S02E01.srt
  |      |-Show 1 S02E02.mp4
  |      |-Show 1 S02E02.srt
  |
  |-Show 2 
  |   |-Season 03
          |- Show 2 S03E02.en.srt
          |- Show 2 S03E02.sv.srt
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 6

您可以使用for循环和一些测试

for f in Show*/Season*/*.srt; do if [[ ! -f "${f%%.*}.mkv" ]] && [[ ! -f "${f%%.*}.mp4" ]] && [[ ! -f "${f%%.*}.avi" ]]; then echo rm -v -- "$f"; fi; done
Run Code Online (Sandbox Code Playgroud)

删除echo测试后删除文件

作为脚本:

#!/bin/bash
for f in Show*/Season*/*.srt; do
    if [[ ! -f "${f%%.*}.mkv" ]] &&
       [[ ! -f "${f%%.*}.mp4" ]] &&
       [[ ! -f "${f%%.*}.avi" ]]; then
         echo rm -v -- "$f"
    fi
done
Run Code Online (Sandbox Code Playgroud)

并删除echo以真正完成工作,如果您看到它将删除正确的文件...

if [[ ! -f "${f%%.*}.mkv" ]]; then意味着,如果没有像我们正在处理的文件那样具有.mkv扩展名而不是 的文件.srt,则对当前文件执行某些操作。