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.