하위 폴더와 플랫 폴더에 대한 For 루프를 한 번에

하위 폴더와 플랫 폴더에 대한 For 루프를 한 번에

내 스크립트에서 이 코드를 사용하여 폴더 내의 파일을 처리하지만 하위 폴더에서만 작동합니다.

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

플랫 폴더 작업을 위해 제거하면 된다는 것을 알고 있지만 /*플랫 폴더(하위 폴더 없음)와 하위 폴더가 있는 폴더를 모두 처리할 수 있는 보다 깔끔한 방법을 찾고 있습니다.

for 루프에 큰 코드가 있으므로 다음에 의존하는 솔루션을 원하지 않습니다.find

답변1

시도해 보세요 globstar.extglobbash

#!/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

관련 정보