
Я использую этот код в своих скриптах для обработки файлов внутри папки, но он работает только для подпапок.
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