
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 extglob
das 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 sind
find
for
Wenn Sie die Schleife in eine Schleife ändern while
und verwenden read
, können Sie sich problemlos auf verlassen, find
ohne 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