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