一次 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

相关内容