Rechercher des noms de fichiers qui ne contiennent pas de chaîne spécifiée


19

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?

Réponses:


28

Simplement:

find . ! -name '*2013*'

Ajoutez un ! -type dpour exclure également les fichiers de type répertoire (comme .lui-même), ou -type fpour 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 2013s'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éphane2013fichier 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 finddans les paramètres régionaux C:

LC_ALL=C find . ! -name '*2013*'

4

Les modèles de nom de fichier Ksh sont suffisants:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

Référence

Si votre shell est bash, vous devez exécuter shopt -s extglobavant 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 lsn'est peut-être pas la bonne commande à utiliser. Pour les stocker dans un tableau

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
Cela ne revient pas dans les sous-répertoires et sautera les fichiers de points (et lsrenverra un message d'erreur si le modèle ne correspond à aucun fichier). Notez également que kshcela triera la liste.
Stéphane Chazelas

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.