GNU/Linux >> Tutoriels Linux >  >> Linux

Comment rechercher des fichiers avec des dizaines de critères avec la commande Bash Find

Avez-vous déjà été bloqué à la recherche d'un fichier sans vous souvenir de l'endroit où vous l'avez enregistré, sans parler du nom du fichier lui-même ? Sous Linux, le Bash find La commande vous aidera à parcourir votre système pour trouver ce fichier.

Pas un lecteur? Regardez ce didacticiel vidéo associé ! b>Vous ne voyez pas la vidéo ? Assurez-vous que votre bloqueur de publicités est désactivé.

La fête find La commande sous Linux offre de nombreuses façons de rechercher des fichiers et des répertoires. Dans ce didacticiel, vous apprendrez comment le dernier accès à un fichier, les autorisations, etc., peuvent aider à trouver des fichiers et des répertoires avec Bash find commande. Commençons !

Prérequis

Si vous souhaitez suivre les différentes démos de ce didacticiel, assurez-vous d'avoir les éléments suivants :

  • Un PC Linux :ce didacticiel utilise Ubuntu 20.04, mais n'importe quelle distribution Linux devrait fonctionner.
  • Le find utilitaire - L'utilitaire de recherche Bash devrait déjà être sur toutes les distributions Linux. Ce didacticiel utilise la version 4.7.0.

Le coup find Commande 101

Trouver un dossier nécessite certains critères; une partie du nom du fichier, un type de fichier, les permissions sur le fichier, etc. Le find La commande vous permet de définir ces critères pour affiner le ou les fichiers exacts que vous souhaitez rechercher. La commande find trouve ou recherche également des liens symboliques (symlink). Un lien symbolique est un fichier de raccourci Linux qui pointe vers un autre fichier ou un dossier sur votre ordinateur. Voyons d'abord la manière la plus simple d'utiliser le Bash find commande.

Peut-être êtes-vous dans votre répertoire personnel, à la recherche d'un répertoire nommé snap et tous les fichiers et sous-répertoires qu'il contient. Dans ce cas, exécutez le find commande, suivi du nom du répertoire ("snap" ), et c'est tout !

Puisqu'il n'y a pas d'autres arguments de ligne de commande ci-dessous, vous pouvez voir la liste des fichiers et des répertoires trouvés de manière récursive dans le snap répertoire.

find "snap"

Si vous ne spécifiez pas le name paramètre, find supposera que le premier argument devrait être pour le name paramètre, par exemple, find "snap" est identique à find -name "snap ."

Rechercher des fichiers avec des tests (aka Filters)

Vous avez vu la forme la plus élémentaire du find commande et son fonctionnement. Mais peut-être souhaitez-vous affiner un peu la recherche pour définir des critères plus spécifiques. Si tel est le cas, vous devrez appliquer des tests. Les tests sont des critères que vous fournissez au find commande.

Les tests indiquent le find commande pour filtrer la sortie en fonction de nombreux critères différents.

Recherche de fichiers par nom de fichier ou de répertoire

Peut-être vous rappelez-vous seulement comment le nom du fichier commence, peut-être d'une manière insensible à la casse. Dans ce cas, vous pouvez utiliser un caractère générique pour affiner les résultats.

# Find files and directories with names starting with 'snap'
find -name "snap*"

# Find files and directories with names starting with 'snap'
# in case insensitive manner (For example:'Snap', 'snap', 'SNaP', etc.)
find -iname "snap*"

Rechercher des fichiers et des répertoires par type de fichier

Comme le -name tester, le -type test est un autre moyen efficace de trouver des fichiers et des répertoires. Le -type test permet de filtrer le résultat du find commande par fichiers ou répertoires.

# Find a file named 'snap'
find "snap" -type f
# Find a directory named 'snap'
find "snap" -type d

Pour affiner davantage la recherche de fichiers, combinez le -name et -type tests en exécutant la commande ci-dessous.

Le find la commande ci-dessous recherche uniquement les répertoires (-type d ) avec des noms (-name ) qui commencent par snap .

find -name "snap*" -type d

Rechercher des fichiers et des répertoires avec des tests et des opérateurs

Maintenant que vous avez appris les bases du find combinée à des tests, il est temps de faire monter d'un cran la recherche de fichiers. Peut-être avez-vous besoin de trouver des fichiers ou des répertoires qui correspondent à plusieurs conditions, telles que le nom et le type de fichier. Dans ce cas, vous devez combiner les conditions.

Lorsque vous devez ajouter plusieurs conditions pour rechercher des fichiers, vous pouvez combiner des conditions avec des opérateurs. Les opérateurs sont des éléments qui vous permettent de combiner des conditions pour former des tests/filtres plus complexes.

Combiner deux conditions avec le -and Opérateur

Peut-être avez-vous besoin de trouver des fichiers ou des répertoires qui correspondent à un nom spécifique et taper. Pour ce faire, vous pouvez utiliser le -and opérateur. Le -and L'opérateur vous permet de combiner deux ou plusieurs expressions et affiche le résultat uniquement si la commande de recherche renvoie une valeur vraie. Les expressions sont les représentations de certaines conditions, comme lors du filtrage de fichiers par nom (-name "snap" ).

Pour montrer comment le -and l'opérateur combine deux conditions, exécutez chacune des commandes suivantes.

# Find files only (-type f) and (-and) ensure the names (-name) start with snap
# in the current directory and subdirectories.
find -name "snap*" -and -type f

# Find directories only (-type d) and (-and) ensure the names (-name) start with snap
# in the current directory and subdirectories.
find -name "snap*" -and -type d

# Find files only (-type f) and (-and) ensure the names (-name) start with snap
find -name "snap" -and -type f

# Find directories only (-type d) and (-and) ensure the names (-name) start with snap
find -name "snap" -and -type d

Combiner deux conditions avec le -or Opérateur

Comme le -and opérateur, le -or opérateur (-o ) combine également deux expressions distinctes. La différence est que le find La commande affichera des résultats même si une seule expression est vraie.

Vous trouverez ci-dessous une syntaxe de base sur la façon de combiner deux conditions avec le -or opérateur. Le find La commande affiche le résultat même si un seul, expr1 ou expr2, renvoie une valeur vraie.

find  -or 

Peut-être aimeriez-vous trouver un nom de fichier en utilisant le -name paramètre d'un type spécifique en utilisant le -type paramètre. Si c'est le cas, exécutez le find commande ci-dessous pour rechercher des fichiers (-type f ) avec des noms (-name ) qui commencent par snap -or chart .

find -name "snap*" -type f -or -name "chart*"

Filtrer les fichiers avec le -not Opérateur

Contrairement aux deux premiers opérateurs où vous filtrez le contenu que vous recherchez, le -not opérateur (! ) est le contraire. Le -not exclut les fichiers et répertoires que vous ne souhaitez pas voir dans les résultats de la recherche.

Peut-être voulez-vous rechercher uniquement des fichiers avec des noms qui ne le font pas commencer par un nom spécifique. Dans ce cas, exécutez la commande suivante. Remarquez le find la commande ci-dessous recherche uniquement les fichiers (-type f ), avec des noms (-name ) que pas commencer par snap .

find -not -name "snap*" -type f

Rechercher des fichiers en regroupant des expressions

À présent, vous avez appris à utiliser des tests et des opérateurs pour filtrer le find résultat de la commande. Mais que se passe-t-il si votre résultat cible est un peu complexe ? Si tel est le cas, vous devez vous pencher sur les expressions de regroupement. Le coup find La commande vous permet de regrouper des expressions, c'est-à-dire de définir deux ou plusieurs "ensembles" de conditions.

Regroupement d'expressions avec des parenthèses

Disons que vous avez besoin de trouver des fichiers ou des répertoires avec des noms différents. Vous trouverez bientôt la tâche impossible en utilisant le find commandes de base, comme indiqué précédemment. Comme solution, vous devrez utiliser des parenthèses pour combiner les expressions pour former une seule expression complexe.

Dans cet exemple ci-dessous, le find la commande recherchera soit les fichiers (-type f ) avec .html extension ou répertoires (-type d ) avec des noms commençant par chart .

Les parenthèses ouvrantes et fermantes sont échappées avec une barre oblique inverse (\ ) pour permettre au terminal de lire littéralement les parenthèses. Le caractère d'échappement indique le find commande pour traiter le caractère littéralement.

find \( -name "*.html" -type f \) -or \( -name "chart*" -type d \)

Plutôt que d'utiliser des parenthèses, vous pouvez également utiliser des virgules pour regrouper des expressions telles que find -name "snap*" -type d -delete, -name "chart*" -print . Le regroupement d'expressions par des virgules est essentiellement une série de tâches en cours d'exécution dans une seule commande.

Recherche de fichiers à partir du répertoire parent

Dans tous les exemples précédents, le Bash find La commande a trouvé des fichiers uniquement à partir du répertoire de travail actuel et de tous les sous-répertoires. Mais peut-être devriez-vous plutôt commencer votre recherche dans le répertoire parent. Si oui, donnez le -depth option un coup. Le -depth Le paramètre répertorie les fichiers et les répertoires par ordre de profondeur, comme indiqué ci-dessous.

Le find La commande ci-dessous répertorie le contenu du répertoire parent en premier et jusqu'au répertoire de travail (snap ).

find "snap" -depth

Recherche de fichiers et de répertoires par autorisation

Au lieu de rechercher des fichiers filtrés par nom et type, la commande find vous permet également de rechercher des fichiers et des répertoires filtrés par autorisation. Sous Linux, chaque fichier et dossier a des autorisations spécifiées pour les propriétaires, les propriétaires de groupe et les autres utilisateurs. Le find La commande vous permet de profiter de ces autorisations pour filtrer le résultat de la recherche de fichiers et de répertoires avec le -perm option.

Avant d'essayer de trouver des fichiers et des répertoires avec le -perm option, vous devrez vous familiariser avec les autorisations de lecture. Les autorisations indiquent qui a accès et peut modifier certains fichiers et répertoires.

Rechercher des fichiers via le mode symbolique

Maintenant que vous comprenez le concept des autorisations de fichiers, essayez de rechercher des fichiers via le mode symbolique. Le mode symbolique utilise une combinaison de lettres et de symboles pour représenter les autorisations de fichiers.

Pour montrer comment rechercher des fichiers via le mode symbolique, exécutez chacune des commandes suivantes.

# Find only files (-type f) in the working directory (.) 
# with read, write and execute permissions for user, group and others in the current
find . -perm u=rwx,g=rwx,o=rwx -type f

# Find files (-type f) in the working directory (.) 
# with any of the read, write and execute permissions (not the exact)
# for user, group and others in the current
find . -perm -u=rwx,g=rwx,o=rwx -type f

# Find files (including hidden files) where either of the user, group or others 
# have read, write and execute access to files in the working directory (.)
find . -perm /u=rwx,g=rwx,o=rwx -type f

Recherche de fichiers et de répertoires via le mode absolu

Si vous ne préférez pas rechercher des fichiers via le mode symbolique, le mode absolu peut piquer votre intérêt. Le mode absolu définit les autorisations en représentation numérique octale par rapport à l'utilisation de lettres.

Ci-dessous vous pouvez voir que le mode symbolique -rwxrwxrwx est équivalent au mode absolu 777 .

Supposons que vous souhaitiez uniquement rechercher des fichiers et des répertoires avec une autorisation en lecture seule pour l'utilisateur, le groupe et les autres. Si tel est le cas, exécutez chacune des commandes ci-dessous pour voir les résultats que vous obtiendrez lors de la recherche de fichiers et de répertoires en mode absolu.

# Find files and directories only with read-only permission 
# for user, group and others in the working directory (.)
find . -perm 444

# Find files and directories only that have least the read-only permission 
# for user, group and others in the working directory (.)
find . -perm -444

# Find files and directories only (including hidden files and directories) 
# that have least the read-only permission 
# for user, group and others in the working directory (.)
find . -perm /444

Modifier le résultat de la recherche avec le -print Paramètre

Au lieu de simplement afficher les chemins d'accès aux fichiers dans le résultat de la recherche, vous souhaitez peut-être également voir leurs propriétés. Utilisation du -print action, vous pouvez modifier la sortie le find commande produit.

Le -print paramètre est le comportement par défaut lorsque vous exécutez le find commande où il imprime le résultat de la recherche de fichiers, chacun sur une nouvelle ligne. Exécutez donc l'une des commandes ci-dessous pour find fichiers et répertoires nommés snap , vous obtiendrez le même résultat.

find -name "snap" -print
find -name "snap"

Rechercher et imprimer des noms de fichiers sans espaces

Contrairement au -print par défaut paramètre, le -print0 L'option vous permet d'effacer les espaces blancs ou les caractères de retour à la ligne dans un résultat de recherche renvoyé par le find commande. Surtout lorsque vous transmettez le résultat à une autre commande comme grep pour rechercher des motifs.

La commande ci-dessous vous permet de rechercher et de générer un répertoire sans espaces ni caractères de saut de ligne.

# Find a file or directory named 'snap', print the result
# removing white spaces and newline characters
find -name "snap" -print0

Rechercher et imprimer un fichier avec des propriétés via le formatage d'impression

Pour changer le format de la sortie, le find la commande a aussi un -printf paramètre. Ce paramètre vous permet de créer des directives ou des "formatters" qui définissent l'apparence du résultat de la recherche.

Peut-être avez-vous besoin de trouver des fichiers avec leurs propriétés comme la dernière fois qu'ils ont été consultés. Si tel est le cas, exécutez les commandes suivantes.

# Find files only with names starting with 'snap', then print each file 
# along with their last-time access properties, full path and filename
# each on a new line
find -name "snap*" -printf "%a %p \n"

# Find files with .html or .json extension 
# then print each file owner's username, group name, full path and filename
# each on a new line
find \( -name "*.html" -type f \) -or -name "*.json" -printf "%u %g %p \n"

Vous trouverez ci-dessous une liste de directives disponibles pour travailler côte à côte avec le -printf action :

  • %a – Renvoie la dernière fois qu'un fichier a été accédé.
  • %b – Renvoie la quantité d'espace disque utilisée pour un fichier en blocs de 512 octets.
  • %d – Renvoie la profondeur d'un fichier dans l'arborescence des répertoires.
  • %g - Renvoie le nom de groupe d'un fichier ou l'ID de groupe numérique si le groupe n'a pas de nom.
  • %k - Renvoie la quantité d'espace disque utilisée pour un fichier en blocs de 1K.
  • %m – Renvoie les bits d'autorisation d'un fichier (en octal).
  • %p – Renvoie le nom de fichier exact d'un fichier.
  • %s – Renvoie la taille d'un fichier en octets.
  • %t – Renvoie l'heure de la dernière modification d'un fichier dans le format renvoyé par le -ctime option.
  • %u – Renvoie le nom d'utilisateur du propriétaire du fichier ou l'ID utilisateur numérique si l'utilisateur n'a pas de nom.

Limitation de la profondeur de recherche de fichiers

Peut-être souhaitez-vous affiner davantage et limiter la recherche dans les annuaires ; vous devrez utiliser le -maxdepth avec le find commande, comme indiqué ci-dessous.

Le -maxdepth le paramètre indique le find pour limiter la portée de la recherche à un certain nombre de sous-répertoires dans l'arborescence des répertoires.

# Find files and directories one step down from the working directory
find . -maxdepth 1 -name "chart*"

# Find files and directories two steps down from the ~/chart directory
find ~/chart -maxdepth 2 -name "chart"

Recherche de fichiers limités au répertoire de travail avec -prune Options

Si vous devez limiter une recherche au seul répertoire de travail actuel et ne pas revenir dans les sous-répertoires, consultez le -prune paramètre.

Dans la commande ci-dessous, vous allez find fichiers et répertoires dont les noms (-name ) ne commence pas par snap et est limité (-prune ) dans le répertoire de travail (. ).

Pour obtenir des résultats de recherche pour les fichiers et dossiers dont les noms commencent par snap à la place, supprimez le -or opérateur et -print action , comme ceci :find . -name "snap*" -prune

find . -name "snap*" -prune -or -print

Rechercher des fichiers et des répertoires via le dernier accès

L'élagage de fichiers particuliers affine sûrement le résultat de la recherche. Mais que se passe-t-il si la seule chose dont vous vous souvenez concernant le fichier que vous recherchez est la dernière fois que vous y avez accédé ? Eh bien, la bonne nouvelle est que la commande find vous permet de rechercher des fichiers et des répertoires via leur dernier accès. Plongeons !

Recherche de fichiers via l'accès au dernier jour du fichier

Disons que vous vous souvenez encore du dernier jour où vous avez accédé à un fichier ou un répertoire, puis le -atime option combinée avec le find La commande est tout ce dont vous avez besoin, comme illustré ci-dessous. Si le dernier accès d'un fichier ne tombe pas sous cette valeur que vous avez spécifiée, le find La commande renvoie une valeur fausse et ignore ce fichier.

# Find files and directories you last accessed between 2-3 days ago
find -atime 2

# Find files and directories you last accessed within the past 2 days
find -atime -2

# Find files and directories you last accessed within the past day
find -atime 0

Peut-être souhaitez-vous également voir le dernier accès d'un fichier ou d'un répertoire, puis ajoutez le -printf action avec directives. La ligne de commande ci-dessous vous permet find fichiers consultés au cours de la dernière journée (-atime 0 ). Puis le -printf l'action affiche le dernier accès (%a ) des fichiers ou répertoires et les noms de fichiers (%p ), chacun sur une nouvelle ligne (\n ), comme indiqué ci-dessous.

find -atime 2 -printf "%a %p \n"

Recherche de fichiers via l'accès de dernière minute au fichier

Disons que vous devez trouver des fichiers en fonction de la minute. Comme le -atime option, le -amin fonctionne de la même manière. Mais à la place, vous obtiendrez des résultats de recherche pour les fichiers filtrés par leur dernier accès en fonction de la valeur que vous avez spécifiée, comme indiqué ci-dessous.

# Find files and directories accessed within the past 40 minutes
# Not ideal most of the time as you will get result of tons of files and directories
find -amin 40

# Find directories accessed within the past 40 minutes
find -name "snap*" -type d -amin -40

# Find files accessed within the past 40 minutes
find -name "snap*" -type f -amin -40

Recherche de fichiers et de répertoires via le dernier changement d'heure

La recherche de fichiers ou de répertoires via le dernier accès peut produire des tonnes de résultats, ce qui semblerait déroutant si les noms de fichiers sont similaires. Donc, pour affiner davantage le résultat de la recherche, utilisez le -ctime à la place. Le -ctime L'option filtre le résultat de la recherche en fonction de la dernière fois que vous avez apporté des modifications au fichier ou au répertoire en fonction d'une valeur spécifiée (au cours des derniers jours).

Vous souhaitez peut-être rechercher les fichiers que vous avez modifiés il y a deux jours. Si tel est le cas, exécutez les exemples de commandes ci-dessous.

# Find files and directories you modifed in the past two days
find -ctime -2

# Find files and directories with names starting with 'snap'
# which you modifed in the past two days
find -name "snap*" -ctime -2

Exécuter une commande après avoir trouvé un fichier ou un répertoire

Le find la commande ne se contente pas de trouver des fichiers et des répertoires ; il peut également exécuter des commandes juste après avoir affiché les résultats de la recherche en utilisant le -exec paramètre. Cette fonctionnalité est idéale lorsque vous souhaitez ouvrir un fichier dans un éditeur de texte ou supprimer un fichier ou un répertoire une fois trouvé, par exemple.

Assurez-vous d'échapper les points-virgules (; ) avec une barre oblique inverse (\ ) pour éviter qu'ils ne soient interprétés.

# Find a file named 'snap.doc' then open the file in vi editor
find -name "snap.doc" -exec vi {} \;

# Find a file named 'snap.doc' then remove the file
find -name "snap.doc" -exec rm {} \;

Supprimer des fichiers et des répertoires avec le -delete Action

Le find La commande ne vous permet pas seulement de trouver des fichiers comme vous l'avez appris jusqu'à présent. Le find La commande vous donne également la possibilité de supprimer automatiquement un fichier une fois qu'il est trouvé. Peut-être avez-vous besoin de supprimer des fichiers ou des répertoires vides avec un nom spécifique ou correspondant à un modèle spécifique. Puis le find commande avec le -delete l'action sera certainement utile.

Pour illustrer la suppression de fichiers et de répertoires avec le -delete action, créez d'abord un répertoire et un fichier. Ci-dessous, les lignes de commande permettent de créer (mkdir ) un répertoire nommé (thanos ), puis un fichier nommé snap à l'intérieur du thanos répertoire.

mkdir thanos
touch thanos/snap

Le -delete l'action ne supprime que les répertoires vides. Donc, si vous essayez de supprimer le thanos répertoire avec la ligne de commande ci-dessous, vous recevrez un message disant find :can can delete 'thanos' :Directory not empty.

Pour supprimer un seul fichier (snap ), indiquez le -type testez lorsque vous exécutez la commande find, comme ceci :find "snap" -type f -delete

# Find a directory named 'thanos', then delete the directory
# This command fails since the 'thanos' directory is not empty
find "thanos" -type d -delete

# Find a file named 'thanos.snap', then delete the file
find "thanos.snap" -type f -delete

Pour supprimer le ~/thanos répertoire, appliquez le -depth option, comme indiqué ci-dessous. Le find la commande recherchera le thanos répertoire et supprimer récursivement (-delete ) le contenu du ~/thanos répertoire et supprimer le répertoire lui-même.

find "thanos" -depth -delete

Conclusion

Cet article visait à vous apprendre différentes manières sur la façon dont la commande de recherche Bash vous permet de localiser des fichiers, d'obtenir des propriétés de fichier et même de modifier une sortie dans certains formats. Auparavant, la recherche d'un fichier perdu était remplie d'obstacles en cours de route. Mais maintenant, vous pouvez sauter par-dessus les obstacles et aller directement à la ligne d'arrivée. Est-ce considéré comme de la triche ?

Eh bien, quelle que soit la méthode que vous avez essayée pour trouver votre fichier, l'expérience est sûrement satisfaisante ! Alors, quel test, action ou option avez-vous trouvé le plus intéressant ?


Linux
  1. Recherche de fichiers dans la ligne de commande (Comment faire)

  2. Comment auditer les autorisations avec la commande find

  3. Comment trouver des fichiers en double sous Linux ? L'aide est ici avec la commande fdupes !

  4. Comment trouver le processus avec un maximum de descripteurs de fichiers ?

  5. Comment trier les fichiers dans des dossiers par type de fichier sur bash (avec la commande 'file') ?

Comment utiliser la commande de lecture Bash

Comment rechercher des fichiers sous Linux avec la commande Find

Comment trouver des fichiers sur la ligne de commande Ubuntu

Comment rechercher des fichiers avec la commande fd sous Linux

Un moyen facile de fusionner des fichiers avec la commande Cat

Comment trouver les répertoires ou fichiers les plus gourmands en espace ?