Debo escribir una utilidad única que realice alguna operación en todos los archivos en un directorio determinado, pero una lista de archivos en una lista predefinida. Dado que la lista dada está predefinida, la codificaré como una matriz.
Habiendo dicho eso, ¿cómo obtener los nombres de todos los archivos que no están en la matriz dada? Esto puede estar en cualquier secuencia de comandos unix estándar (bash, awk, perl).
Respuesta aceptada:
Con bash
, podrías hacer:
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[@]}"
(que funciona aquí para los archivos en el directorio actual, pero no de forma fiable para globs como all=(*/*) except=(foo/bar)
como usamos /
para unir los elementos de la matriz para la búsqueda).
Se basa en el hecho de que "${array[*]}"
une los elementos de la matriz con el primer carácter de $IFS
(aquí elegido para ser /
ya que de otra manera no puede ocurrir en un archivo nombre; NUL es un carácter que no puede aparecer en un archivo ruta , pero desafortunadamente bash
(al contrario de zsh
) no puede tener tal carácter en sus variables). Entonces, para cada archivo en $all
(aquí con $file
siendo foo
como ejemplo), hacemos un case "/file1/file2/notme.txt/" in (*"/foo/"*)
para verificar si $file
debe ser excluido.