Exclure un répertoire dans le modèle de correspondance `ls`

13

Je suis en train de lsdirs qui ont des .pngfichiers à l' intérieur (pas besoin de récursivité, mais il serait utile supplémentaire), d' une exepté. Exclure un répertoire, c.-à-d.

ls */*.png

fonctionne bien.

ls (^one)*/*.png

ne renvoie aucune sortie standard. Comment y parvenir?

Je suis aveugle et je le passe espeak, donc je ne peux entendre que la sortie pour l'instant.

Tomas Jankus
la source
Quel shell utilisez-vous? Votre motif ressemble à un motif zsh, bien qu'il ne soit pas utile car il n'exclurait pas one(le bon motif serait ^one/*.png), il imprimerait tout.
Gilles 'SO- arrête d'être méchant'

Réponses:

16

Option 1 - en utilisant simplement ls:
Avec le globbing bash étendu activé ( shopt -s extglob), vous pouvez faire:

ls !(one*)/*.png


Option 2 - combiner lset grep:

Vous pouvez combiner lsavecgrep -v

  • par exemple ls */*.png | grep -v "one/"


Option 3 - (le meilleur IMO) mais n'utilise findpas ls:

Pour une recherche récursive de tous les sous-répertoires à l'aide de find

find . -type f -name "*.png" -not -path "*/one/*"


Tous les monolignes ci-dessus répertorieront les répertoires avec des .pngfichiers tout en filtrant tout chemin correspondant one/; seule l'option 3 le fera récursivement.

toxefa
la source
La findcommande n'a- t-elle pas besoin de dire -path "*/one/*"ou -path "./one/*"?
G-Man dit `` Réintègre Monica '' le
@ G-Man Vous avez absolument raison. Modifié ci-dessus.
toxefa
Cela ne correspondrait-il pas encore ./phone/handset.png?
G-Man dit `` Réintègre Monica '' le
@ G-Man Qu'est-ce qui ne va pas avec la correspondance de .pngs dans un répertoire appelé phone? Je pensais que nous essayions juste d'exclure one?
toxefa
1
Eh bien, puisque vous l'utilisez en relation avec -not, cela signifie qu'il entraîne l' findexclusion des fichiers dans un répertoire appelé phone.
G-Man dit 'Réinstalle Monica' le
6

En zsh , mettez setopt extended_globvotre ~/.zshrc. Ensuite, vous pouvez utiliser le modèle générique ^one pour exclure le répertoire appelé one.

ls ^one/*.png

Si vous voulez **/récursivement dans des sous-répertoires, utilisez pour la globalisation récursive. Pour exclure le répertoire appelé oneau niveau supérieur, ainsi que le répertoire de niveau supérieur:

ls ^one/**/*.png

Pour exclure des fichiers d'un sous-répertoire appelé one, mais pas des fichiers de ses sous-répertoires:

ls **/^one/*.png

Pour exclure des fichiers d'un sous-répertoire appelé oneà n'importe quel niveau, utilisez un motif de répétition avec l' #opérateur autour de la négation:

ls (^one/)#/*.png
Gilles 'SO- arrête d'être méchant'
la source