Comment utiliser la commande find sous Linux

0
303
fatmawati achmad zaenuri/Shutterstock

Le Linux La commande find est idéale pour rechercher des fichiers et des répertoires. Mais vous pouvez également transmettre les résultats de la recherche à d'autres programmes pour un traitement ultérieur. Nous vous montrons comment.

La commande Linux find

La commande Linux find est puissante et flexible. Il peut rechercher des fichiers et des répertoires en utilisant toute une série de critères différents, pas seulement des noms de fichiers. Par exemple, il peut rechercher des fichiers vides, des fichiers exécutables ou des fichiers appartenant à un utilisateur particulier. Il peut trouver et répertorier les fichiers en fonction de leurs heures d'accès ou de modification, vous pouvez utiliser des modèles regex, il est récursif par défaut et il fonctionne avec des pseudo-fichiers comme des canaux nommés (tampons FIFO).

RELATEDComment utiliser toutes les commandes de recherche de Linux

Tout cela est incroyablement utile. L'humble commande find a vraiment du pouvoir. Mais il existe un moyen de tirer parti de ce pouvoir et de faire passer les choses à un autre niveau. Si nous pouvons prendre la sortie de la commande find et l'utiliser automatiquement comme entrée d'autres commandes, nous pouvons faire en sorte que quelque chose arrive aux fichiers et répertoires que find découvre pour nous.

Le principe de rediriger la sortie d'une commande vers une autre commande est une caractéristique essentielle des systèmes d'exploitation dérivés d'Unix. Le principe de conception consistant à faire en sorte qu'un programme fasse une chose et la fasse bien, et s'attendre à ce que sa sortie puisse être l'entrée d'un autre programme, même un programme non encore écrit, est souvent décrit comme « Unix ». philosophie.” Et pourtant, certains utilitaires de base, comme mkdir, n'acceptent pas les entrées transmises.

RELATEDComment utiliser la commande xargs sous Linux

Pour remédier à cette lacune, la commande xargs peut être utilisée pour répartir l'entrée transmise et l'alimenter dans d'autres commandes comme s'il s'agissait de paramètres de ligne de commande pour cette commande. Cela permet d'obtenir presque la même chose que la tuyauterie simple. C'est “presque pareil” chose, et pas “exactement la même” chose parce qu'il peut y avoir des différences inattendues avec les extensions de shell et la globalisation des noms de fichiers.

Utiliser find avec xargs

Nous pouvons utiliser find avec xargs à une action effectuée sur les fichiers trouvés. C'est une méthode de longue haleine, mais nous pourrions alimenter les fichiers trouvés par find dans xargs , qui les redirige ensuite dans tar pour créer un fichier d'archive de ces fichiers. Nous allons exécuter cette commande dans un répertoire contenant de nombreux fichiers PAGE du système d'aide.

find ./-name “*.page” -type f -print0 | xargs -0 tar -cvzf page_files.tar.gz

La commande est composée de différents éléments.

  • trouver ./-name “*.page” -type f -print0:  L'action de recherche démarre dans le répertoire actuel, en recherchant par nom les fichiers qui correspondent à la “*.page” chaîne de recherche. Les répertoires ne seront pas répertoriés car nous lui disons spécifiquement de rechercher uniquement les fichiers, avec -type f. L'argument print0 indique à find de ne pas traiter les espaces blancs comme la fin d'un nom de fichier. Cela signifie que les noms de fichiers contenant des espaces seront traités correctement.
  • xargs -o : les -0 arguments xargs pour ne pas traiter les espaces comme la fin d'un nom de fichier.
  • tar -cvzf page_files.tar.gz : c'est la commande xargs qui va alimenter la liste des fichiers de find vers. L'utilitaire tar créera un fichier d'archive appelé “page_files.tar.gz.”

Publicité

Nous pouvons utiliser ls pour voir le fichier d'archive qui est créé pour nous.

ls *.gz

Le fichier archive est créé pour nous. Pour que cela fonctionne, tous les noms de fichiers doivent être transmis à tar en masse, ce qui s'est passé. Tous les noms de fichiers ont été marqués à la fin de la commande tar comme une très longue ligne de commande.

Vous pouvez choisir d'exécuter la commande finale sur tous les noms de fichiers à la fois ou d'être invoquée une fois par nom de fichier. Nous pouvons voir la différence assez facilement en redirigeant la sortie de xargs vers l'utilitaire de comptage de lignes et de caractères wc.

Cette commande dirige tous les noms de fichiers dans wc à la fois. Effectivement, xargs construit une longue ligne de commande pour wc avec chacun des noms de fichiers qu'il contient.

find . -name “*.page” -type f -print0 | xargs -0 wc

Les lignes, mots et caractères de chaque fichier sont imprimés, ainsi qu'un total pour tous les fichiers.

Publicité

Si nous utilisons l'option xarg‘s  -I (replace string) et définissons un jeton de chaîne de remplacement& #8212;dans ce cas ” {}“—le jeton est remplacé dans la commande finale par chaque nom de fichier à son tour. Cela signifie que wc est appelé à plusieurs reprises, une fois pour chaque fichier.

find . -name “*.page” -type f -print0 | xargs -0 -I “{}” wc “{}”

La sortie n'est pas bien alignée. Chaque invocation de wc fonctionne sur un seul fichier, donc wc n'a rien avec lequel aligner la sortie. Chaque ligne de sortie est une ligne de texte indépendante.

Parce que wc ne peut fournir qu'un total lorsqu'il opère sur plusieurs fichiers à la fois, nous n'obtenons pas les statistiques récapitulatives.

L'option find -exec

La commande find a une méthode intégrée d'appel de programmes externes pour effectuer un traitement supplémentaire sur les noms de fichiers qu'elle renvoie. L'option -exec (exécuter) a une syntaxe similaire mais différente de la commande xargs.

find . -name “*.page” -type f -exec wc -c “{}” ;

Cela comptera les mots dans les fichiers correspondants. La commande est constituée de ces éléments.

  • trouver .: Lancer la recherche dans le répertoire courant. La commande find est récursive par défaut, donc les sous-répertoires seront également recherchés.
  • -name “*.page” : nous recherchons des fichiers avec des noms qui correspondent à la “*.page” chaîne de recherche.
  • -type f : nous ne recherchons que des fichiers, pas des répertoires.
  • -exec wc : nous allons exécuter la commande wc sur les noms de fichiers qui correspondent à la chaîne de recherche.
  • -w: toutes les options que vous souhaitez transmettre à la commande doivent être placées immédiatement après la commande.
  • “{}” : le “{ }” l'espace réservé représente chaque nom de fichier et doit être le dernier élément de la liste des paramètres.
  • ;: Un point-virgule “;” est utilisé pour indiquer la fin de la liste des paramètres. Il doit être échappé avec une barre oblique inverse “” afin que le shell ne l'interprète pas.

Lorsque nous exécutons cette commande, nous voyons la sortie de wc. Le -c (nombre d'octets) limite sa sortie au nombre d'octets dans chaque fichier.

Publicité< br>

Comme vous pouvez le voir, il n'y a pas de total. La commande wc est exécutée une fois par nom de fichier. En substituant un signe plus “+” pour le point-virgule de fin “;” nous pouvons modifier le comportement de -exec‘s pour opérer sur tous les fichiers à la fois.

find . -name “*.page” -type f -exec wc -c “{}” +

Nous obtenons le total récapitulatif et les résultats soigneusement tabulés qui nous indiquent que tous les fichiers ont été transmis à wc sous la forme d'une longue ligne de commande.

exec signifie vraiment exec

L'option -exec (exécuter) ne lance pas la commande en l'exécutant dans le shell actuel. Il utilise l'exec intégré de Linux pour exécuter la commande, remplaçant le processus actuel de votre shell par la commande. Ainsi, la commande qui est lancée ne s'exécute pas du tout dans un shell. Sans shell, vous ne pouvez pas obtenir l'expansion shell des caractères génériques, et vous n'avez pas accès aux alias et aux fonctions shell.

Cet ordinateur a une fonction shell définie appelée mots uniquement. Cela ne compte que les mots d'un fichier.

function words-only () {   wc -w $1 } CONNEXESComment créer des alias et des fonctions shell sur Linux

Une fonction étrange peut-être, “words-only” est beaucoup plus long à taper que “wc -w” mais au moins, cela signifie que vous n'avez pas besoin de vous souvenir des options de ligne de commande pour wc. Nous pouvons tester ce qu'il fait comme ceci :

word-only user_commands.pages

Cela fonctionne très bien avec une invocation de ligne de commande normale. Si nous essayons d'invoquer cette fonction en utilisant l'option find‘s -exec, cela échouera.

trouver . -name “*.page” -type f -exec mots uniquement “{}” ;

Publicité

La commande find ne peut pas trouver la fonction shell et l'action -exec échoue.

Pour surmonter cela, nous pouvons lancer un shell Bash et lui transmettre le reste de la ligne de commande en tant qu'arguments du shell. Nous devons placer la ligne de commande entre guillemets doubles. Cela signifie que nous devons échapper aux guillemets doubles qui entourent le “{}” replace string.

Avant de pouvoir exécuter la commande find, nous devons exporter notre fonction shell avec l'option -f (en tant que fonction) :

export -f words-only find . -name “*.page” -type f -exec bash -c “words-only “{}”” ;

Cela fonctionne comme prévu.

Utiliser le nom de fichier plus d'une fois

Si vous souhaitez enchaîner plusieurs commandes, vous pouvez le faire, et vous pouvez utiliser le “{}” remplacez la chaîne dans chaque commande.

find . -name “*.page” -type f -exec bash -c “basename “{}” && mots uniquement “{}”” ;

Si nous montons d'un niveau en dehors des “pages” répertoire et exécutez cette commande, find découvrira toujours les fichiers PAGE car il recherche de manière récursive. Le nom de fichier et le chemin sont transmis à notre fonction de mots uniquement comme auparavant. Pour des raisons purement de démonstration de l'utilisation de -exec avec deux commandes, nous appelons également la commande basename pour voir le nom du fichier sans son chemin.

A la fois la commande basename et le shell word-only la fonction leur transmet les noms de fichiers à l'aide d'un “{}” remplacer la chaîne.

Chevaux pour les cours

Il y a une charge CPU et une pénalité de temps pour l'appel répété d'une commande alors que vous pouviez l'appeler une fois et lui transmettre tous les noms de fichiers en une seule fois. Et si vous appelez un nouveau shell à chaque fois pour lancer la commande, cette surcharge s'aggrave.

Publicité

Mais parfois—selon ce que vous’essayez d'accomplir& #8212;vous n'avez peut-être pas d'autre option. Quelle que soit la méthode requise par votre situation, personne ne devrait être surpris que Linux offre suffisamment d'options pour que vous puissiez trouver celle qui convient à vos besoins particuliers.

LIRE LA SUITE

  • › Se souvenir de VRML : Le métaverse de 1995
  • › Quel contenu 8K est réellement disponible ?
  • › Gagnants du prix Best of CES 2022 de Geek : ce qui nous passionne
  • › Que signifie “NBD” La moyenne et comment l'utiliser ?
  • › Les lunettes à lumière bleue fonctionnent-elles ? Tout ce que vous devez savoir
  • › Rien de bénéfique ne vient du défilement sans esprit