LINUX.ORG.RU

test -f с несколькими файлами

 ,


0

2

Есть ли простой бескостыльный способ проверить присутствие файлов по маске, помимо перебора в цикле?

Простым скриптом проверяю наличие файлов субтитров, если ничего нет — запускаю whisper. У уже имеющихся файлов в имени может быть указан или не указан язык. Файлов субтитров для одного видео может быть несколько. То есть могут быть $name.srt, $name.en.srt, $name.ru.srt, $name.fr.srt и т.п. в любых сочетаниях или не быть ничего.

for f in *.mp4 ; 
do
  name="`basename "$f" .mp4`" ; 
  if [ ! -f "$name"*.srt ] ; 
  then
    ffmpeg -i "$f" ... "$name"... && whisper-cpp ..."$name"... ; 
  fi ; 
done

[ ! -f "$name"*.srt ] работает, если файла нет, или есть только один. Если файлов несколько, test выдаёт ошибку, и ветка then не выполняется, что тоже приемлемо, но криво.

Как принято поступать в таком случае?

Перемещено hobbit из general

★★★★★

На баше или другом языке, написать скрипт, с более сложной логикой, которая явно охватит все нужные ситуации и обработает их :)

Мне кажется тут не надо гнаться за краткостью.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от ALiEN175

Субтитры к аниме ни разу не качали?

Нет, не анимешник.

А парсить вывод ls нельзя)

А где ты видел чтоб я его парсил? ls отдает код возврата, по нему и определяется есть ли файлы подходящие под маску.

iron ★★★★★
()
Ответ на: комментарий от iron

А что это, если не парсинг? Скармливаете строку ls в ожидании возврата кода от ls.

ls создана для чтения её вывода человеком, а не для подстановки в разные команды.

Утилита ls может искромсать имена файлов. В зависимости от платформы, на которой выработаете, от используемых вами аргументов (или не используемых), а также в зависимости от того, указывают ли на терминал стандартные выходные данные, ls может внезапно заменить какие-то символы в имени файла на «?». Или вообще их не выводить. Никогда не пытайтесь парсить выходные данные ls.

Чтение на ночь

PS Сам лично сталкивался, когда ls неверно выводила имена файлов, подставляя знаки вопроса.

ALiEN175
()
Ответ на: комментарий от ALiEN175

А что это, если не парсинг?

Парсинг – это когда ты берешь список файлов, обрабатываешь его и на основе этого делаешь вывод: есть там такие файлы или нет. В моем примере ls-у отдается паттерн и спрашивается: «а ну скажи ка дорогой, есть ли там такие файлы или нет?». В итоге, парсингом самих названий файлов занимается он. А нам лишь отвечает да или нет.

ls создана для чтения её вывода человеком, а не для подстановки в разные команды.

Так можно сказать про любую программу, которая выводит что-либо в каналы STDOUT и/или STDERR. Только кожаные мешки почему-то создают на них программы и называют их скриптами.

PS Сам лично сталкивался, когда ls неверно выводила имена файлов, подставляя знаки вопроса.

Тогда парсить вывод нужно самому. У топикстартера был вопрос о том, как это сделать без перебирания всех файлов. Собственно, ему и накидали вариантов, которых для его юз.кейса хватит заглаза.

iron ★★★★★
()
Ответ на: комментарий от iron

ls-у отдается паттерн и спрашивается: «а ну скажи ка дорогой, есть ли там такие файлы или нет?»

Ну давай-ка, дорогой, покажи мне файл -1.sh

$: ls -1.sh
ls: неверный ключ — «.»
По команде «ls --help» можно получить дополнительную информацию.
# ой, что-то не так. Печалька. А ну-ка еще раз! И закавычим!

$: ls '-1.sh'
ls: неверный ключ — «.»
По команде «ls --help» можно получить дополнительную информацию.
# Тоже не то. А давайте закавычим всё! В кавычках спасение!

$: ls '"-1.sh"'
ls: невозможно получить доступ к '"-1.sh"': Нет такого файла или каталога
#Ой, а что случилось?

$: ls \-1.sh
ls: неверный ключ — «.»
По команде «ls --help» можно получить дополнительную информацию.
#И экранирование не помогает. Больше экранов!!!!

$: ls \\-1.sh
ls: невозможно получить доступ к '\-1.sh': Нет такого файла или каталога
$: ls \\\-1.sh
ls: невозможно получить доступ к '\-1.sh': Нет такого файла или каталога
#Будешь дальше использовать ls в скриптах?
ALiEN175
()
Ответ на: комментарий от ALiEN175

а теперь добавь в суп LANG=C

Тебе не надоело придумывать ситуации, которые в подавляющем большинстве случаев нигде не встретишь? В скрипте можно и LANG выставить, при желании.

iron ★★★★★
()
Ответ на: комментарий от iron

ладно, убедил)

Но сам ls тоже явно умнее стал =) Как ни пытался - так и не смог его заставить знаки вопроса вывести))

ALiEN175
()
Последнее исправление: ALiEN175 (всего исправлений: 1)
Ответ на: комментарий от ALiEN175

Как ни пытался - так и не смог его заставить знаки вопроса вывести))

В этом году наблюдал на полудохлой системе с отвалившейся русификацией. Но не исключаю, что в пайп пошло бы что-то другое.

question4 ★★★★★
() автор топика
Ответ на: комментарий от iron

много ты видел файлов субтитров, которые начинаются с минуса?

Файлы субтитров начинаются с того же символа, с которого начинается файл видео, который создаётся yt-dlp, который берёт название из заголовка или текста страницы, где дефис в начале нередок. -- приходится ставить очень часто.

question4 ★★★★★
() автор топика