Как я могу удалить файл, у которого нет соответствующего файла с другим расширением - PullRequest
0 голосов
/ 12 декабря 2018

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

Вы можете сделать это следующим образом:

#!/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

0 голосов
/ 12 декабря 2018
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" или его альтернатива modern-bash-синтаксису [[ -s $mp4_file ]] проверяет, существует ли файл с таким именем ине пусто.
  • foo || bar выполняет bar тогда и только тогда, когда foo возвращает логическое-ложное значение.

Таким образом, эффект заключается в зацикливании файлов втекущий каталог, пропуская каталоги, оканчивающиеся на .mp4, ищите парные или совпадающие .mp4 файлы и удаляйте файлы, для которых не найдено подходящих .mp4.

...