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.
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 lename
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 lefind
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 permetfind
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 ?