2009-03-22 7 views
4

Linux: Je souhaite répertorier tous les fichiers dans un répertoire et dans ses sous-répertoires, à l'exception de certaines chaînes. Pour cela, j'ai utilisé une combinaison de find/grep/shell globbing. Par exemple, je veux à la liste tous les fichiers sauf ceux dans les répertoiresQuelle est la version la plus compacte de "faire correspondre tout sauf ces chaînes" dans le shell ou regex?

./bin 
./lib 
./resources 

Je comprends cela peut être fait comme indiqué in this question et this other. Mais les deux versions ne résolvent pas le cas "tout, mais ce modèle" en termes généraux.

Il semble qu'il soit beaucoup plus facile d'utiliser un conditionnel pour filtrer les résultats, mais je me demande s'il existe une façon compacte et élégante de décrire cela dans regexp ou dans la globalisation étendue du shell.

Merci.

+0

Évitez d'utiliser "ici" pour le texte du lien. – ashawley

+0

Désolé, comme l'anglais n'est pas ma langue maternelle, je ne connais pas la bonne façon. Pourriez-vous suggérer quelque chose? Merci. – alvatar

Répondre

3

Avec bash's extglob shopt setting activé, vous pouvez exclure des fichiers avec ! dans votre wildcard pattern. Quelques exemples:

  • Tout sauf bin, lib, et les ressources

     
    shopt -s extglob 
    ls -Rl !(bin|lib|resources) 
    
  • Tout avec un i en elle, à l'exception bin et lib

     
    ls -Rl !(bin|lib|!(*i*)) 
    

    (Tout ce qui a un i dans ce est le même que tout sauf les choses que ne ont i est dans eux.)

+0

Le plus compact. J'ai essayé des choses similaires, mais je n'ai jamais réalisé que si vous mettez le * alors tout est égalé, donc le chemin était sans rien d'autre. Je me demande comment cela pourrait être ajouté à d'autres restrictions. Comme: "tout ce qui a un" i "sauf" bin "et" lib "... – alvatar

7

yourcommand | egrep -v "pattern1|pattern2|pattern3"

+0

Je n'étais pas au courant de ce changement d'egrep. C'est un bon moyen. Merci! – alvatar

+0

Cela supprimera tous les fichiers qui ont un motif dans leur nom, ce qui pourrait être plus, alors vous voulez supprimer. – vartec

+0

Je suis d'accord avec @vartec - cela peut être dangereux. Je préfère l'option pruneau. –

6

option Utiliser pruneau de trouver.

find . -path './bin' -prune -o -path './lib' -prune -o -path './resources' -prune -o «rest of your find params» 
Questions connexes