For-Schleife für Unterordner und flache Ordner gleichzeitig

For-Schleife für Unterordner und flache Ordner gleichzeitig

Ich verwende diesen Code in meinen Skripten, um Dateien in einem Ordner zu verarbeiten, aber er funktioniert nur für Unterordner.

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

Ich weiß, dass ich es einfach entfernen kann, /*um mit flachen Ordnern zu arbeiten, aber ich suche nach einer saubereren Möglichkeit, sowohl flache Ordner (ohne Unterordner) als auch Ordner mit Unterordnern zu verwalten.

Ich habe großen Code in der For-Schleife, also möchte ich keine Lösungen, die darauf angewiesen sindfind

Antwort1

Versuchen Sie globstar, und extglobdas ist spezifisch fürbash

#!/usr/bin/env bash

shopt -s globstar extglob

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

Antwort2

Ich habe großen Code in der For-Schleife, also möchte ich keine Lösungen, die darauf angewiesen sindfind

forWenn Sie die Schleife in eine Schleife ändern whileund verwenden read, können Sie sich problemlos auf verlassen, findohne den Inhalt der Schleife weiter umgestalten zu müssen:

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

verwandte Informationen