Цикл для подпапок и плоских папок одновременно

Цикл для подпапок и плоских папок одновременно

Я использую этот код в своих скриптах для обработки файлов внутри папки, но он работает только для подпапок.

if [ -d "$1" ]; then for file in "${1%/}/"*/*(*.mkv|*.mp4|*.avi); do 

Я знаю, что могу просто удалить /*, чтобы работать с плоскими папками, но я ищу более понятный способ обработки как простых папок (без подпапок), так и папок с подпапками.

У меня большой код в цикле for, поэтому мне не нужны решения, которые полагаются наfind

решение1

Попробуйте globstarи extglobчто конкретно относится кbash

#!/usr/bin/env bash

shopt -s globstar extglob

if [[ -d $1 ]]; then
  for file in "$1"/**/*.@(mkv|mp4|avi); do
  :
  done
fi 

решение2

У меня большой код в цикле for, поэтому мне не нужны решения, которые полагаются наfind

Если изменить forцикл на whileцикл и использовать read, на него можно будет легко положиться findбез дальнейшего рефакторинга того, что находится внутри цикла:

find "$1" -name "*.mkv" -o -name "*.mp4" -o -name "*.avi" -print0 | \
while read -d '' file; do
  # Process file
done

Связанный контент