Je voudrais exécuter l'opposé de:
find . -name "*2013*"
Recherchez tous les fichiers du répertoire actuel qui ne contiennent pas la chaîne "2013" dans leurs noms. Comment puis je faire ça?
Simplement:
find . ! -name '*2013*'
Ajoutez un ! -type d
pour exclure également les fichiers de type répertoire (comme .
lui-même), ou -type f
pour n'inclure que les fichiers normaux , excluant tous les autres types de fichiers (répertoires, fifos, liens symboliques, périphériques, sockets ...).
Attention cependant qui *
correspond à une séquence de 0 ou plusieurs caractères . Il pourrait donc signaler les noms de fichiers qui contiennent 2013
s'ils ont 2013
été précédés ou suivis de quelque chose qui ne peut pas être entièrement décodé en tant que caractères valides dans les paramètres régionaux actuels.
Cela peut se produire si vous vous trouvez dans un environnement local où les caractères peuvent être codés sur plusieurs octets (comme en UTF-8) pour les noms de fichiers codés dans un codage différent. Par exemple, dans un environnement local UTF-8, il signalerait un Stéphane2013
fichier s'il é
avait été encodé dans le jeu de caractères iso8859-15 (comme l'octet 0xe9).
Le mieux serait de s'assurer que les noms de fichiers sont encodés dans le jeu de caractères des paramètres régionaux, mais si vous ne pouvez pas le garantir, une solution consiste à exécuter find
dans les paramètres régionaux C:
LC_ALL=C find . ! -name '*2013*'
Les modèles de nom de fichier Ksh sont suffisants:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Si votre shell est bash, vous devez exécuter shopt -s extglob
avant de pouvoir utiliser ce modèle (vous pouvez le mettre dans votre .bashrc
). Si votre shell est zsh, vous devez exécuter setopt ksh_glob
(vous pouvez le mettre dans votre .zshrc
). Zsh propose également ls -d -- ^*2013*
, ce qui nécessite un préalable setopt extended_glob
.
Selon ce que vous faites avec ces noms de fichiers, ce ls
n'est peut-être pas la bonne commande à utiliser. Pour les stocker dans un tableau
filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
ls
renverra un message d'erreur si le modèle ne correspond à aucun fichier). Notez également queksh
cela triera la liste.Trouvez tous les fichiers du répertoire courant qui ne contiennent pas une certaine chaîne, ici "2013":
la source