Ich muss ein einmaliges Dienstprogramm schreiben, das einige Operationen für alle Dateien in einem bestimmten Verzeichnis ausführt, aber eine Liste von Dateien in einer vordefinierten Liste. Da die angegebene Liste vordefiniert ist, werde ich sie als Array fest codieren.
Wie kann man jedoch die Namen aller Dateien abrufen, die nicht im angegebenen Array enthalten sind? Dies kann in jedem Standard-Unix-Skript (bash, awk, perl) sein.
Akzeptierte Antwort:
Mit bash
, könnten Sie Folgendes tun:
all=(*)
except=(file1 file2 notme.txt)
only=()
IFS=/
for file in "${all[@]}"; do
case "/${except[*]}/" in
(*"/$file/"*) ;; # do nothing (exclude)
(*) only+=("$file") # add to the array
esac
done
ls -ld -- "${only[@]}"
(das funktioniert hier für die Dateien im aktuellen Verzeichnis, aber nicht zuverlässig für Globs wie all=(*/*) except=(foo/bar)
da wir /
verwenden um die Elemente des Arrays für die Suche zusammenzufügen).
Es basiert auf der Tatsache, dass "${array[*]}"
verbindet die Elemente des Arrays mit dem ersten Zeichen von $IFS
(hier gewählt als /
da es sonst in einer Datei name nicht vorkommen kann; NUL ist ein Zeichen, das in einem Pfad einer Datei nicht vorkommen darf , aber leider bash
(im Gegensatz zu zsh
) darf ein solches Zeichen nicht in seinen Variablen haben). Also für jede Datei in $all
(hier mit $file
foo
sein als Beispiel) machen wir einen case "/file1/file2/notme.txt/" in (*"/foo/"*)
um zu prüfen, ob $file
ist auszuschließen.