Как я могу удалить файл, у которого нет соответствующего файла с другим расширением

Это немного сложно объяснить, но я ищу относительно простой 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 ответа

Решение
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 || bar исполняет bar если и только если foo возвращает логическое-ложное значение

Таким образом, эффект заключается в том, чтобы перебирать файлы в текущем каталоге, пропуская те, которые заканчиваются на .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

Другие вопросы по тегам