À partir de (remarquez les caractères génériques avant et après "du texte")
find . -type f -name '*some text*'
Comment peut-on exclure / ignorer tous les fichiers et répertoires cachés?
Cela fait trop longtemps que je googe dans Google . paramètres (point d’exclamation), mais aucun exemple approprié (et parcimonieux) qui a juste fonctionné .
La tuyauterie |
à grep
serait une option et j’aimerais aussi des exemples de cela; mais je m'intéresse surtout à une brève ligne unique (ou à deux lignes uniques, illustrant différentes manières d'atteindre le même objectif de ligne de commande), simplement à l' aide de find
.
ps: Trouver des fichiers sous Linux et exclure des répertoires spécifiques semble étroitement lié, mais a) n'est pas encore accepté et b) est lié-mais-différent-et-distinct, mais c) peut être une source d'inspiration et permettre de mettre le doigt sur la confusion!
Modifier
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, travaux. La regex recherche "n'importe quoi, puis une barre oblique, puis un point, puis n'importe quoi" (c'est-à-dire tous les fichiers et dossiers cachés, y compris leurs sous-dossiers) et le "!" nie la regex.
la source
Réponses:
Ceci imprime tous les fichiers qui sont les descendants de votre répertoire, en ignorant les fichiers et répertoires cachés:
Donc, si vous cherchez un fichier avec
some text
son nom et que vous voulez ignorer les fichiers et répertoires cachés, lancez:Explication:
L'
-path
option run vérifie qu'un modèle correspond à la chaîne de chemin d'accès complète.*
est un caractère générique,/
un séparateur de répertoire,\.
un point (il doit être échappé pour éviter toute signification spéciale) et*
un autre caractère générique.-not
signifie que ne sélectionnez pas les fichiers correspondant à ce test.Je ne pense pas que ce
find
soit assez intelligent pour éviter de rechercher récursivement les répertoires cachés dans la commande précédente, aussi si vous avez besoin de rapidité, utilisez-prune
plutôt, comme ceci:la source
-print
à la fin! De plus,-name '\.*' would be more efficient instead of
je ne sais pas si -path` (car le chemin recherche des sous-chemins, mais ceux-ci seront supprimés).
dans ce contexte?find
signifie le répertoire actuel:find
examinera tous les fichiers et répertoires du répertoire actuel. L'argument suivantpath
est une expression régulière, dans laquelle un point signifie normalement "n'importe quel caractère". Pour lui donner un point littéral, nous devons l'échapper avec une barre oblique inverse. L'argument après-name
n'est pas une expression régulière, mais il étend les jokers comme?
et*
comme le fait un shell..
avoir une signification spéciale..
. Pour autant que je sache, que ceux - ci doivent être échappé:*
,?
et[]
.C'est l'un des rares moyens d'exclure les fichiers de points qui fonctionnent également correctement sous BSD, Mac et Linux:
$PWD
affiche le chemin complet du répertoire actuel pour que le chemin ne commence pas par./
-name ".*" -prune
correspond à tous les fichiers ou répertoires qui commencent par un point, puis ne descendent pas-o -print
signifie imprimer le nom du fichier si l'expression précédente ne correspond à rien. L'utilisation de-print
ou-print0
empêche toutes les autres expressions de s'imprimer par défaut.la source
-o ... -print
est utile. Pour mon usage, je l’ai maintenantfind ... '!' -name . -name '.*' -prune -o ... -print
, ce qui était plus pratique que d’inclure $ PWD.Exclut tous les répertoires cachés et les fichiers cachés sous $ DIR
la source
La réponse que j'avais initialement publiée en tant que "modification" de ma question initiale ci-dessus:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, travaux. La regex recherche "n'importe quoi, puis une barre oblique, puis un point, puis n'importe quoi" (c'est-à-dire tous les fichiers et dossiers cachés, y compris leurs sous-dossiers) et le "!" nie la regex.la source
find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print
Vous n'êtes pas obligé d'utiliser
find
pour cela. Utilisez simplement globstar dans shell it-self, comme ceci:ou:
où
**/
représente n'importe quel dossier de manière récursive et*foo*
n'importe quel fichier qui afoo
son nom.Par défaut, using
ls
imprimera les noms de fichiers à l’exclusion des fichiers et répertoires cachés.Si vous n'avez pas activé la fonction de recherche, faites-le en
shopt -s globstar
.Remarque: une nouvelle option de globbing fonctionne dans les shell Bash 4, zsh et similaires.
Exemple:
la source
ls
de ça!echo **/*foo*
/
signifie dossier, il sépare les répertoires du nom de fichier.*
représente fondamentalement tout.La réponse de @ Flimm est bonne, en particulier parce qu'elle empêche la recherche de descendre dans des répertoires cachés . Je préfère cette simplification:
Généralement pour exclure tous les chemins cachés (fichiers normaux, répertoires, etc.):
Par exemple, en utilisant votre répertoire de travail comme point de départ et
-name '*some text*'
comme expression:Contrairement à ce que suggère la réponse de @ Flimm, il n’ya pas de fichiers cachés ni de répertoires cachés. L'
-path '*/.*'
expression est vraie pour tout chemin (fichiers réguliers, répertoires, etc.) qui a un.
immédiatement après votre séparateur de fichiers,/
. Donc, cette ligne va élaguer les fichiers cachés et les répertoires.Autoriser les fichiers cachés tout en excluant les répertoires cachés est le cas qui nécessite un filtre supplémentaire. C’est là que vous incluez
-type d
dans l’expression à élaguer.Par exemple:
Dans ce cas, il
-type d -path '*/.*'
s’agittrue
uniquement de répertoires et seuls les répertoires sont élagués.la source
find
a des commutateurs logiques ordonnés tels que-and
et-not
vous pouvez les utiliser à votre avantage pour trouver un fichier correspondant avec deux règles comme ceci:Comme vous pouvez le voir,
find
utilise deux règles-name '*hidden_file*'
et-and \( -not -name ".*" \)
de trouver les noms de fichiers qui correspondent à deux conditions - le nom de fichier avechidden_file
en elle , mais sans point de premier plan. Notez les barres obliques devant les parenthèses - elles sont utilisées pour définir les parenthèses en tantfind
qu'arguments plutôt que pour définir un sous-shell (c'est ce que signifient les parenthèses sinon sans barres obliques)la source
Remarques:
.
: dossier en cours-maxdepth 1
pour rechercher récursivement-type f
: recherche de fichiers, pas de répertoires (d
)-not -path '*/\.*'
: ne pas revenir.hidden_files
sed 's/^\.\///g'
: supprimer le préfixe./
de la liste des résultatsla source