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.