GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Alle Dateien außer den Dateien im Array abrufen – Bash?

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.


Linux
  1. Liste aller Dateien nach Maske im Terminal abrufen?

  2. Wie bekomme ich das Tty, in dem Bash läuft?

  3. Das ultimative Bash-Array-Tutorial mit 15 Beispielen

  4. So finden Sie alle Sparse-Dateien in Linux

  5. Wie man alle Dateien in allen Unterverzeichnissen in Bash gzippt

Bash-Arrays

Assoziatives Array in Bash

Löschen Sie alle Dateien außer den neuesten 3 im Bash-Skript

Wie erhalte ich die tatsächliche Verzeichnisgröße (aus du)?

bash - entfernt alle Verzeichnisse (und Inhalte), aber keine Dateien in pwd

Erstellen Sie ein Array mit allen Netzwerkschnittstellen in Bash