하위 폴더 및 플랫 폴더에 대한 for 루프 1개

하위 폴더 및 플랫 폴더에 대한 for 루프 1개

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

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로 변경 하고 다음을 사용 하면 루프 내부의 내용을 추가로 리팩토링하지 않고도 이에 의존하기 쉽습니다 .whilereadfind

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

관련 정보