一次 for 迴圈子資料夾和平面資料夾

一次 for 迴圈子資料夾和平面資料夾

我在腳本中使用此程式碼來處理資料夾內的文件,但它僅適用於子資料夾。

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

我知道我可以刪除/*以使用平面資料夾,但我正在尋找一種更乾淨的方法來處理平面資料夾(無子資料夾)和帶有子資料夾的資料夾。

我在 for 循環中有大量程式碼,所以我不想要依賴的解決方案find

答案1

嘗試globstarextglob具體針對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

相關內容