Musím napsat jednorázový nástroj, který provede nějakou operaci se všemi soubory v daném adresáři, ale se seznamem souborů v předdefinovaném seznamu. Vzhledem k tomu, že daný seznam je předdefinovaný, zakóduji jej napevno jako pole.
Jak však získat názvy všech souborů, které nejsou v daném poli? To může být v libovolném standardním unixovém skriptu (bash, awk, perl).
Přijatá odpověď:
S bash , můžete udělat:
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[@]}"
(to funguje zde pro soubory v aktuálním adresáři, ale ne spolehlivě pro globs jako all=(*/*) except=(foo/bar) jako my používáme / pro spojení prvků pole pro vyhledávání).
Je založeno na skutečnosti, že "${array[*]}" spojuje prvky pole s prvním znakem $IFS (zde zvoleno jako / protože se jinak nemůže vyskytovat v souboru name; NUL je znak, který se nemůže vyskytovat v cestě souboru , ale bohužel bash (na rozdíl od zsh ) nemůže mít ve svých proměnných takový znak). Tedy pro každý soubor v $all (zde s $file být foo jako příklad) uděláme case "/file1/file2/notme.txt/" in (*"/foo/"*) zkontrolovat, zda $file je třeba vyloučit.