Bucle for para subcarpetas y carpetas planas a la vez

Bucle for para subcarpetas y carpetas planas a la vez

Utilizo este código en mis scripts para procesar archivos dentro de una carpeta, pero solo funciona para subcarpetas.

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

Sé que puedo eliminarlas /*para trabajar con carpetas planas, pero estoy buscando una forma más limpia de manejar tanto las carpetas planas (sin subcarpetas) como las carpetas con subcarpetas.

Tengo un código grande en el bucle for, por lo que no quiero soluciones que dependan defind

Respuesta1

Pruebe globstary extglobcuál es específico parabash

#!/usr/bin/env bash

shopt -s globstar extglob

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

Respuesta2

Tengo un código grande en el bucle for, por lo que no quiero soluciones que dependan defind

Si cambia el forbucle a whilebucle y usa read, es fácil confiar en él findsin necesidad de refactorizar más lo que hay dentro del bucle:

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

información relacionada