UNIX pour trouver les noms de fichiers ne se terminant pas par des extensions spécifiques?

Existe-t-il un moyen simple de rechercher de manière récursive tous les fichiers d’une hiérarchie de répertoires, qui ne se terminent pas par une liste d’extensions? Par exemple, tous les fichiers qui ne sont pas * .dll ou * .exe

UNIX / GNU find, aussi puissant soit-il, ne semble pas avoir de mode d’ exclude (ou je le manque), et j’ai toujours trouvé difficile d’utiliser des expressions régulières pour trouver des choses qui ne correspondent pas expression.

Je suis dans un environnement Windows (en utilisant le port GnuWin32 de la plupart des outils GNU). Je suis donc tout aussi ouvert aux solutions Windows uniquement.

    Ou sans ( et la nécessité d’y échapper:

     find . -not -name "*.exe" -not -name "*.dll" 

    et d’exclure également la liste des répertoires

     find . -not -name "*.exe" -not -name "*.dll" -not -type d 

    ou en logique positive 😉

     find . -not -name "*.exe" -not -name "*.dll" -type f 
     find . ! \( -name "*.exe" -o -name "*.dll" \) 
     $ find . -name \*.exe -o -name \*.dll -o -print 

    Les deux premières options -name n’ont pas d’option -print, elles ont donc été ignorées. Tout le rest est imprimé.

    Vous pouvez faire quelque chose en utilisant la commande grep:

     find . | grep -v '(dll|exe)$' 

    L’indicateur -v sur grep signifie spécifiquement “trouver des choses qui ne correspondent pas à cette expression”.

    un de plus 🙂

      $ ls -ltr
     total 10
     -rw-r - r-- 1 scripteur linuxdumb 47 déc 23 14:46 test1
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:40 test4
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:40 test3
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:40 test2
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:41 file5
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:41 file4
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:41 file3
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:41 file2
     -rw-r - r-- 1 scripteur linuxdumb 0 jan 4 23:41 file1
     $ trouver.  -type f!  -name "* 1"!  -name "* 2" -print
     ./test3
     ./test4
     ./fichier3
     ./fichier4
     ./fichier5
     $
    
    

    Unix trouve la référence de commande

    Linux / OS X:

    À partir du répertoire en cours, recherchez de manière récursive tous les fichiers se terminant par .dll ou .exe

     find . -type f | grep -P "\.dll$|\.exe$" 

    À partir du répertoire actuel, recherchez de manière récursive tous les fichiers qui ne se terminent pas par .dll ou .exe

     find . -type f | grep -vP "\.dll$|\.exe$" 

    Remarques:

    (1) L’option P de grep indique que nous utilisons le style Perl pour écrire nos expressions régulières à utiliser avec la commande grep . Dans le but d’exécuter la commande grep conjointement avec des expressions régulières, je trouve que le style Perl est le style le plus puissant.

    (2) L’option v sur grep indique au shell d’exclure tout fichier satisfaisant à l’expression régulière

    (3) Le caractère $ à la fin de “.dell $” est un caractère de contrôle de délimiteur qui indique au shell que la chaîne de nom de fichier se termine par “.dll”

    D’autres solutions sur cette page ne sont pas souhaitables si vous avez une longue liste d’extensions – en conservant une longue séquence de -not -name 'this' -not -name 'that' -not -name 'other' serait fastidieuse et erronée -prone – ou si la recherche est programmatique et que la liste des extensions est générée à l’exécution.

    Pour ces situations, une solution qui sépare plus clairement les données (la liste des extensions) et le code (les parameters à find ) peut être souhaitable. Étant donné une structure de répertoire et de fichier qui ressemble à ceci:

     . └── a ├── 1.txt ├── 15.xml ├── 8.dll ├── b │  ├── 16.xml │  ├── 2.txt │  ├── 9.dll │  └── c │  ├── 10.dll │  ├── 17.xml │  └── 3.txt ├── d │  ├── 11.dll │  ├── 18.xml │  ├── 4.txt │  └── e │  ├── 12.dll │  ├── 19.xml │  └── 5.txt └── f ├── 13.dll ├── 20.xml ├── 6.txt └── g ├── 14.dll ├── 21.xml └── 7.txt 

    Vous pouvez faire quelque chose comme ça:

     ## data section, list undesired extensions here declare -a _BADEXT=(xml dll) ## code section, this never changes BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | sed 's/|/\\|/g' )" find . -type f ! -regex ".*\.\($BADEXT\)" 

    Qui aboutit à:

     ./a/1.txt ./a/b/2.txt ./a/b/c/3.txt ./a/d/4.txt ./a/d/e/5.txt ./a/f/6.txt ./a/f/g/7.txt 

    Vous pouvez modifier la liste des extensions sans modifier le bloc de code.

    REMARQUE ne fonctionne pas avec la recherche native d’OSX – utilisez plutôt gnu find.

     find /data1/batch/source/export -type f -not -name "*.dll" -not -name "*.exe"