À partir de (notez le 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?
J'ai déjà googlé depuis bien trop longtemps , suis tombé sur des -Prune et! paramètres (point d’exclamation), mais pas d’exemple approprié (et parcimonieux) qui vient de fonctionner .
Tuyauterie |
to grep
serait une option et j'aimerais également avoir des exemples. mais principalement je suis intéressé par une brève une ligne (ou deux lignes uniques, illustrant différentes manières d'atteindre le même objectif de ligne de commande) juste en utilisant find
.
ps: Rechercher 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 fournir inspiration et aide. repérer la confusion!
Modifier
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, fonctionne. 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.
Le réponse J'ai initialement posté en tant que "modifier" ma question initiale ci-dessus:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, fonctionne. 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.
Ceci affiche tous les fichiers qui sont les descendants de votre répertoire, en ignorant les fichiers et répertoires cachés:
find . -not -path '*/\.*'
Donc, si vous cherchez un fichier avec some text
dans son nom et que vous voulez ignorer les fichiers et répertoires cachés, exécutez:
find . -not -path '*/\.*' -type f -name '*some text*'
L'option -path
exécute la vérification d'un modèle par rapport à la chaîne de chemin d'accès complète. *
est un caractère générique, /
est un séparateur de répertoire, \.
est un point (il doit être échappé pour éviter toute signification spéciale) et *
est un autre caractère générique. -not
signifie que vous ne sélectionnez pas les fichiers correspondant à ce test.
Je ne pense pas que find
soit suffisamment intelligent pour éviter la recherche récursive de répertoires cachés dans la commande précédente. Si vous avez besoin de rapidité, utilisez plutôt -Prune
, comme ceci:
find . -type d -path '*/\.*' -Prune -o -not -name '.*' -type f -name '*some text*' -print
C’est l’un des rares moyens d’exclure les fichiers de points qui fonctionnent également correctement sous BSD, Mac et Linux:
find "$PWD" -name ".*" -Prune -o -print
$PWD
affiche le chemin complet du répertoire actuel pour qu'il ne commence pas par ./
-name ".*" -Prune
correspond à tous les fichiers ou répertoires commençant par un point puis ne descendant pas-o -print
signifie imprimer le nom du fichier si l'expression précédente ne correspond à rien. Utiliser -print
ou -print0
fait que toutes les autres expressions ne s'impriment pas par défaut.find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)
Exclut tous les répertoires cachés et les fichiers cachés sous $ DIR
Vous n'avez pas à utiliser find
pour cela. Utilisez simplement globstar dans Shell it-self, comme ceci:
echo **/*foo*
ou:
ls **/*foo*
où **/
représente un dossier de façon récursive et *foo*
tout fichier dont le nom est foo
.
Par défaut, utiliser ls
imprimera les noms de fichiers à l’exclusion des fichiers et des répertoires cachés.
Si vous n’avez pas activé la fonctionnalité de recherche, faites-le avec shopt -s globstar
.
Remarque: ne nouvelle option de globbing fonctionne dans les shell Bash 4, zsh et similaires.
Exemple:
$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo a/b/c/d/foo_not_hidden
@ Flimm réponse est bon, , en particulier parce qu'il 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.):
find <start-point> -path '*/.*' -Prune -o <expression> -print
Par exemple, en utilisant votre répertoire de travail comme point de départ et -name '*some text*'
comme expression:
find . -path '*/.*' -Prune -o -name '*some text*' -print
Contrairement à ce que suggère la réponse de @ Flimm, aucun fichier ni répertoire caché n’est un cas simple. L'expression -path '*/.*'
est vraie pour tout chemin d'accès (fichiers normaux, répertoires, etc.) ayant 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 ici que vous voudriez inclure -type d
dans l'expression à élaguer.
find <start-point> -type d -path '*/.*' -Prune -o <expression> -print
Par exemple:
find . -type d -path '*/.*' -Prune -o -name '*some text*' -print
Dans ce cas, -type d -path '*/.*'
est true
uniquement pour les répertoires, de sorte que seuls les répertoires sont élagués.
find
a des commutateurs logiques soignés tels que -and
et -not
vous pouvez les utiliser à votre avantage pour trouver un fichier correspondant avec deux règles comme ceci:
$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt
$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)
./non_hidden_file.txt
Comme vous pouvez le constater, find
utilise deux règles -name '*hidden_file*'
et -and \( -not -name ".*" \)
pour rechercher les noms de fichiers correspondant aux deux conditions - nom_fichier avec hidden_file
mais sans point de départ. Notez les barres obliques devant les parenthèses - elles sont utilisées pour définir les parenthèses sous la forme d'arguments find
plutôt que pour définir un sous-shell (ce qui veut dire entre parenthèses sinon sans barres obliques).
$ pwd
/home/victoria
$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2
$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2
Notes:
.
: dossier actuel-maxdepth 1
pour effectuer une recherche récursive-type f
: recherche des fichiers, pas des répertoires (d
)-not -path '*/\.*'
: ne retourne pas .hidden_files
sed 's/^\.\///g'
: supprime le ./
ajouté à la liste des résultats