как отфильтровать или извлечь файл из каталога?

Обычно я использую VLC для просмотра фильмов с внешними файлами субтитров. Иногда тайминги в файле немного сбиваются, но для меня это всегда было проблемой с файлами, а не с VLC.

Что вы имеете в виду под «теряет через некоторое время»? Субтитры перестают отображаться или они не синхронизируются с видео?

0
26.07.2018, 11:35
3 ответа

Вы можете использоватьfind:

find. -name "*_*_*" -not -name "*.*"

Это также будет искать в подкаталогах. Если вы этого не хотите, добавьте -maxdepth 1и, возможно, -type f, если вам нужны только обычные файлы:

find. -maxdepth 1 -type f -name "*_*_*" -not -name "*.*"

Добавьте -printf "%P\n", чтобы избавиться от предыдущего ./.

4
28.01.2020, 02:18

С ksh, bash -O extglobили zsh -o kshglobс использованием некоторых двойных -отрицаний (здесь предполагается, что вы также хотите исключить файлы с 3 или более символами подчеркивания):

printf '%s\n' !(!(*_*_*)|*_*_*_*|*.*)

С zsh -o extendedglobи его ~, кроме оператора :

printf '%s\n' *_*_*~(*_*_*_*|*.*)

или используя родной оператор отрицания zsh:

printf '%s\n' ^(^*_*_*|*_*_*_*|*.*)

Если вам по-прежнему нужны файлы с более чем двумя символами подчеркивания, это просто !(!(*_*_*)|*.*), *_*_*~*.*или ^(^*_*_*|*.*)вместо вышеуказанного соответственно.

Другими подходами могут быть!(*[._]*)_!(*[._]*)_!(*[._]*)(заменить [_.]на ., чтобы разрешить 3 или более символов подчеркивания ).

0
28.01.2020, 02:18

Упрощенно, в bash (или оболочках, поддерживающих массивы:

files=(???_???_???)

Здесь используется подстановочный символ ?для подбора файлов с именами, как вы показали, с 3 символами, подчеркиванием, 3 символами, подчеркиванием, затем 3 символами. Это может быть сорвано, если у вас есть имя файла, такое как xyz_qrs_t.1.

Чуть более изысканным было бы:

files=([^._][^._][^._]_[^._][^._][^._]_[^._][^._][^._])

... который использует синтаксис[^... ]подстановки . Каждый [^._]запрашивает один символ, который не является точкой или символом подчеркивания. Смешаны два символа подчеркивания, разделяющие три партии по три [^._].

Прокрутите их с помощью:

for f in "${files[@]}"; do printf "File: %s\n" "$f"; done
0
28.01.2020, 02:18

Теги

Похожие вопросы