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.