En effet, j'avais mal lu ton message, tu veux ignorer les répertoires cachés. Dans ce cas il faut plutôt prendre le critère -path qui va comparer au chemin complet du fichier.
Ça donne
find ~ -type f -name "*s" -and -not -path \*/.\*
Ce n'est pas une expression rationnelle (et pas régulière qui est une traduction trop litérale de l'anglais) c'est un shell pattern, les back-slash sont juste là pou empêcher le shell de l'interpréter lui-même. Ça laisse donc
*/.*
qui va être comparé au chemin complet du fichier (-path), comme le slash est le séparateur de noms de fichiers ça signifie tout fichier dont le nom commence par un point.
Note que la proposition de benoar est effectivement plus efficace puisqu'elle ignore complètement les répertoires en question (mais prendra les fichiers cachés, si ce n'est pas ce que tu veux il faut retirer le -type d)
Je conseillerai plutôt un : find ~ -type d -name .\* -prune -or -type f -name "*s" -print
qui n'ira même pas parcourir les répertoires cachés, contrairement à ta commande.
A noter que la syntaxe citée plus haut avec -prune est probablement bien meilleure dans ce cas précis: les répertoires ignorés ne sont pas parcourus, alors qu'avec ma proposition, ils le sont (bien que leur contenu soit totalement ignoré).
'.*/\..*/..*'
guillemets simples: pour que le shell n'évalue rien à l'intérieur.
On recherche un motif contenant xxxxx/.xxxxx/xxxxx (chaque xxxx étant n'importe quel caractère, y compris aucun caractère). En gros, c'est un nom de répertoire commençant par un point. Un nom de répertoire est toujours encadré par des slashes.
Dans une expression régulière, au lieu d'écrire xxxxx, on écrit .* ce qui indique "n'importe quel caractère (le point), n'importe quel nombre de fois (l'étoile), y compris zéro fois".
Pour indiquer qu'on recherche le caractère 'point', il faut l'échapper car il a une signification particulière. Donc \. pour rechercher un point.
L'expression pourrait être améliorée par '.*/\..*/.*' car sinon on indique qu'on élimine les noms de répertoires suivis d'un nom de fichier contenant au moins un caractère, ce qui est forcément le cas. '..*' indique "n'importe quel caractère (le point) suivi de n'importe quel caractère (le second point) zéro ou x fois (l'étoile). C'est la même chose que '.+' qui indique "n'importe quel caractère, au moins une fois". Mais là, pas besoin de préciser qu'il faut au moins un caractère.
# -and -not -name .\*
Posté par wismerhill . Évalué à 3.
[^] # Re: -and -not -name .\*
Posté par eastwind☯ . Évalué à 2.
find ~ -type f -name "*s" -and -not -name .\*
[^] # Re: -and -not -name .\*
Posté par wismerhill . Évalué à 3.
Ça donne
find ~ -type f -name "*s" -and -not -path \*/.\*
[^] # Re: -and -not -name .\*
Posté par eastwind☯ . Évalué à 2.
Au fait pourrais-tu m'expliquer l'expression régulière derrière le path ?
[^] # Re: -and -not -name .\*
Posté par wismerhill . Évalué à 4.
*/.*
qui va être comparé au chemin complet du fichier (-path), comme le slash est le séparateur de noms de fichiers ça signifie tout fichier dont le nom commence par un point.
Note que la proposition de benoar est effectivement plus efficace puisqu'elle ignore complètement les répertoires en question (mais prendra les fichiers cachés, si ce n'est pas ce que tu veux il faut retirer le -type d)
[^] # Re: -and -not -name .\*
Posté par benoar . Évalué à 3.
find ~ -type d -name .\* -prune -or -type f -name "*s" -print
qui n'ira même pas parcourir les répertoires cachés, contrairement à ta commande.
[^] # Re: -and -not -name .\*
Posté par Obsidian . Évalué à 0.
# Pas très intuitif :-)
Posté par Kerro . Évalué à 1.
find ~ -type f -name 'xxxxx' -and -not -regex '.*/\..*/..*'
find ~ \( ! -regex '.*/\..*/..*' \) -type f -name 'xxxxx'
[^] # Re: Pas très intuitif :-)
Posté par eastwind☯ . Évalué à 2.
pourrais tu m' eclairer
[^] # Re: Pas très intuitif :-)
Posté par Kerro . Évalué à 4.
'.*/\..*/..*'
guillemets simples: pour que le shell n'évalue rien à l'intérieur.
On recherche un motif contenant xxxxx/.xxxxx/xxxxx (chaque xxxx étant n'importe quel caractère, y compris aucun caractère). En gros, c'est un nom de répertoire commençant par un point. Un nom de répertoire est toujours encadré par des slashes.
Dans une expression régulière, au lieu d'écrire xxxxx, on écrit .* ce qui indique "n'importe quel caractère (le point), n'importe quel nombre de fois (l'étoile), y compris zéro fois".
Pour indiquer qu'on recherche le caractère 'point', il faut l'échapper car il a une signification particulière. Donc \. pour rechercher un point.
L'expression pourrait être améliorée par '.*/\..*/.*' car sinon on indique qu'on élimine les noms de répertoires suivis d'un nom de fichier contenant au moins un caractère, ce qui est forcément le cas. '..*' indique "n'importe quel caractère (le point) suivi de n'importe quel caractère (le second point) zéro ou x fois (l'étoile). C'est la même chose que '.+' qui indique "n'importe quel caractère, au moins une fois". Mais là, pas besoin de préciser qu'il faut au moins un caractère.
J'espère que c'est clair :-)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.