GNU/Linux >> Linux Esercitazione >  >> Linux

Ottieni tutti i file tranne i file nell'array - Bash?

Mi viene richiesto di scrivere un programma di utilità una tantum che esegua alcune operazioni su tutti i file in una determinata directory ma un elenco di file in un elenco predefinito. Poiché l'elenco fornito è predefinito, lo codificherò come un array.

Detto questo, come ottenere i nomi di tutti i file che non si trovano nell'array specificato? Questo può essere in qualsiasi script Unix standard (bash, awk, perl).

Risposta accettata:

Con bash , potresti fare:

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[@]}"

(funziona qui per i file nella directory corrente, ma non in modo affidabile per glob come all=(*/*) except=(foo/bar) poiché utilizziamo / per unire gli elementi dell'array per la ricerca).

Si basa sul fatto che "${array[*]}" unisce gli elementi dell'array con il primo carattere di $IFS (qui scelto per essere / in quanto non può altrimenti verificarsi in un file nome; NUL è un carattere che non può comparire in un file percorso , ma sfortunatamente bash (contrariamente a zsh ) non può avere un tale carattere nelle sue variabili). Quindi per ogni file in $all (qui con $file essendo foo ad esempio), eseguiamo un case "/file1/file2/notme.txt/" in (*"/foo/"*) per verificare se $file è da escludere.


Linux
  1. Ottieni l'elenco di tutti i file per maschera nel terminale?

  2. Come ottenere il Tty in cui è in esecuzione Bash?

  3. Il tutorial Ultimate Bash Array con 15 esempi

  4. Come trovare tutti i file sparsi in Linux

  5. Come gzippare tutti i file in tutte le sottodirectory in bash

Matrici Bash

Matrice associativa in Bash

Come ottenere tutti i file che superano determinate dimensioni ed eliminarli

Come posso ottenere valori univoci da un array in Bash?

Come ottenere lo stato di uscita un ciclo in bash

bash - rimuove tutte le directory (e i contenuti) ma non i file in pwd