Recherche…


Introduction

find est une commande permettant de rechercher de manière récursive un répertoire pour des fichiers (ou répertoires) correspondant à un critère, puis d'effectuer une action sur les fichiers sélectionnés.

trouver search_path selection_criteria action

Syntaxe

  • find [-H] [-L] [-P] [-D debugopts] [-Olevel] [chemin ...] [expression]

Recherche d'un fichier par nom ou par extension

Pour rechercher des fichiers / répertoires avec un nom spécifique, par rapport à pwd :

$ find . -name "myFile.txt"
./myFile.txt

Pour rechercher des fichiers / répertoires avec une extension spécifique, utilisez un caractère générique:

$ find . -name "*.txt"
./myFile.txt
./myFile2.txt

Pour rechercher des fichiers / répertoires correspondant à l'une des nombreuses extensions, utilisez le drapeau or :

$ find . -name "*.txt" -o -name "*.sh"

Pour trouver des fichiers / répertoires dont le nom commence par abc et se termine par un caractère alpha à la suite d'un chiffre:

$ find . -name "abc[a-z][0-9]"

Pour trouver tous les fichiers / répertoires situés dans un répertoire spécifique

$ find /opt

Pour rechercher uniquement des fichiers (pas des répertoires), utilisez -type f :

find /opt -type f

Pour rechercher uniquement des répertoires (pas des fichiers réguliers), utilisez -type d :

find /opt -type d

Recherche de fichiers par type

Pour rechercher des fichiers, utilisez le drapeau -type f

$ find . -type f

Pour trouver des répertoires, utilisez le drapeau -type d

$ find . -type d

Pour rechercher des périphériques de bloc, utilisez l'indicateur -type b

$ find /dev -type b

Pour trouver des liens symboliques, utilisez le drapeau -type l

$ find . -type l

Exécuter des commandes sur un fichier trouvé

Parfois, nous devrons exécuter des commandes sur beaucoup de fichiers. Cela peut être fait en utilisant xargs .

find . -type d -print | xargs -r chmod 770

La commande ci-dessus trouvera de manière récursive tous les répertoires ( -type d ) relatifs à . (qui est votre répertoire de travail actuel) et exécutez chmod 770 sur eux. L'option -r indique à xargs de ne pas exécuter chmod si find n'a trouvé aucun fichier.

Si vos noms de fichiers ou répertoires contiennent un caractère d'espace, cette commande peut être bloquée; une solution consiste à utiliser les éléments suivants

find . -type d -print0 | xargs -r -0 chmod 770

Dans l'exemple ci-dessus, les -print0 et -0 spécifient que les noms de fichiers seront séparés à l'aide d'un octet null et permettent l'utilisation de caractères spéciaux, tels que des espaces, dans les noms de fichiers. Ceci est une extension GNU et peut ne pas fonctionner dans d'autres versions de find et xargs .


La méthode privilégiée consiste à ignorer la commande xargs et à find le sous-processus lui-même:

find . -type d -exec chmod 770 {} \;

Ici, le {} est un espace réservé indiquant que vous souhaitez utiliser le nom du fichier à ce stade. find exécutera chmod sur chaque fichier individuellement.

Vous pouvez également passer tous les noms de fichiers à un seul appel de chmod , en utilisant

find . -type d -exec chmod 770 {} +

C'est aussi le comportement des extraits de xargs ci-dessus. (Pour appeler chaque fichier individuellement, vous pouvez utiliser xargs -n1 ).


Une troisième option consiste à laisser bash la boucle sur la liste des noms de fichiers find résultats:

find . -type d | while read -r d; do chmod 770 "$d"; done

Ceci est syntaxiquement le plus lourd, mais pratique lorsque vous souhaitez exécuter plusieurs commandes sur chaque fichier trouvé. Cependant, cela est dangereux face aux noms de fichiers avec des noms impairs.

find . -type f | while read -r d; do mv "$d" "${d// /_}"; done

qui remplacera tous les espaces dans les noms de fichiers par des traits de soulignement. (Cet exemple ne fonctionnera pas non plus s'il y a des espaces dans les noms de répertoires principaux.)

Le problème avec ce qui précède est que while read -r attend une entrée par ligne, mais que les noms de fichiers peuvent contenir des nouvelles lignes (et aussi, read -r perdra tout espace vide). Vous pouvez résoudre ce problème en retournant les choses:

find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +

De cette façon, -exec reçoit les noms de fichiers sous une forme complètement correcte et portable; le bash -c reçoit sous la forme d'un certain nombre d'arguments, qui seront trouvés dans $@ , correctement cités, etc. citations.)

Le mystérieux _ est nécessaire car le premier argument de bash -c 'script' est utilisé pour remplir $0 .

Recherche de fichier par temps d'accès / modification

Sur un système de fichiers ext , chaque fichier est associé à une heure d'accès, de modification et de changement (Status) associée. Pour afficher ces informations, vous pouvez utiliser stat myFile.txt ; En utilisant les drapeaux dans find , nous pouvons rechercher des fichiers qui ont été modifiés dans un certain intervalle de temps.

Pour rechercher des fichiers qui ont été modifiés au cours des 2 dernières heures:

$ find . -mmin -120

Pour rechercher des fichiers qui n'ont pas été modifiés au cours des 2 dernières heures:

$ find . -mmin +120

L'exemple ci - dessus sont à la recherche que sur le temps modifié - à la recherche sur un temps de ccès, ou c pendu fois, utilisez a ou c en conséquence.

$ find . -amin -120
$ find . -cmin +120

Format général:

-mmin n : le fichier a été modifié n minutes auparavant
-mmin -n : Le fichier a été modifié il y a moins de n minutes
-mmin +n : le fichier a été modifié il y a plus de n minutes


Recherchez les fichiers qui ont été modifiés au cours des 2 derniers jours:

find . -mtime -2

Recherchez les fichiers qui n'ont pas été modifiés au cours des 2 derniers jours

find . -mtime +2

Utilisez -atime et -ctime pour le temps d'accès et l'heure de changement d'état respectivement.

Format général:

-mtime n : le fichier a été modifié il y a 24 heures
-mtime -n : le fichier a été modifié il y a moins de 24 heures
-mtime +n : le fichier a été modifié il y a plus de 24 heures

Recherchez les fichiers modifiés dans une plage de dates , du 2007-06-07 au 2007-06-08:

find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08  

Recherchez les fichiers accessibles dans une plage d'horodatages (en utilisant des fichiers comme horodatage), il y a 1 heure à 10 minutes:

touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print  

Format général:

-newerXY reference : Compare l'horodatage du fichier en cours avec la référence. XY peut avoir l'une des valeurs suivantes: at (heure d'accès), mt (heure de modification), ct (heure de modification) et plus. reference est le nom d'un fichier que l'on souhaite comparer à l'horodatage spécifié (accès, modification, modification) ou à une chaîne décrivant une heure absolue.

Recherche de fichiers par extension spécifique

Pour rechercher tous les fichiers d'une certaine extension dans le chemin d'accès actuel, vous pouvez utiliser la syntaxe de find suivante. Cela fonctionne en utilisant bash's construction de glob intégrée de bash's pour correspondre à tous les noms ayant le .extension .

find /directory/to/search -maxdepth 1 -type f -name "*.extension"

Pour trouver tous les fichiers de type .txt du répertoire actuel seul, faites

find . -maxdepth 1 -type f -name "*.txt"

Recherche de fichiers en fonction de leur taille

Trouvez des fichiers de plus de 15 Mo:

find -type f -size +15M

Trouver des fichiers moins de 12 Ko:

find -type f -size -12k

Trouvez des fichiers d'une taille de 12 Ko exactement:

find -type f -size 12k

Ou

find -type f -size 12288c

Ou

find -type f -size 24b

Ou

find -type f -size 24

Format général:

find [options] -size n[cwbkMG]

Trouver des fichiers de taille n-block, où + n signifie plus que n-block, -n signifie moins que n-block et n (sans aucun signe) signifie exactement n-block

Taille de bloc:

  1. c : octets
  2. w : 2 octets
  3. b : 512 octets (par défaut)
  4. k : 1 Ko
  5. M : 1 Mo
  6. G : 1 Go

Filtrer le chemin

Le paramètre -path permet de spécifier un motif correspondant au chemin du résultat. Le motif peut également correspondre au nom lui-même.

Pour rechercher uniquement les fichiers contenant un log n'importe où sur leur chemin (dossier ou nom):

find . -type f -path '*log*'

Pour rechercher uniquement les fichiers dans un dossier appelé log (à n'importe quel niveau):

find . -type f -path '*/log/*'

Pour rechercher uniquement les fichiers dans un dossier appelé log ou data :

find . -type f -path '*/log/*' -o -path '*/data/*'

Pour rechercher tous les fichiers sauf ceux contenus dans un dossier appelé bin :

find . -type f -not -path '*/bin/*'

Pour trouver tous les fichiers, sauf ceux contenus dans un dossier appelé bin ou fichiers journaux:

find . -type f -not -path '*log' -not -path '*/bin/*'


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow