Je dois écrire un utilitaire unique qui effectue une opération sur tous les fichiers d'un répertoire donné, mais une liste de fichiers dans une liste prédéfinie. Étant donné que la liste donnée est prédéfinie, je vais la coder en dur sous forme de tableau.
Cela dit, comment obtenir les noms de tous les fichiers qui ne sont pas dans le tableau donné ? Cela peut être dans n'importe quel script Unix standard (bash, awk, perl).
Réponse acceptée :
Avec bash
, vous pourriez faire :
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[@]}"
(qui fonctionne ici pour les fichiers du répertoire courant, mais pas de manière fiable pour les globs comme all=(*/*) except=(foo/bar)
comme nous utilisons /
pour joindre les éléments du tableau pour la recherche).
Il est basé sur le fait que "${array[*]}"
joint les éléments du tableau avec le premier caractère de $IFS
(ici choisi pour être /
car cela ne peut pas se produire autrement dans un fichier nom; NUL est un caractère qui ne peut pas apparaître dans un fichier chemin , mais malheureusement bash
(contrairement à zsh
) ne peut pas avoir un tel caractère dans ses variables). Donc, pour chaque fichier dans $all
(ici avec $file
être foo
par exemple), on fait un case "/file1/file2/notme.txt/" in (*"/foo/"*)
pour vérifier si $file
est à exclure.