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:
-
c
: octets -
w
: 2 octets -
b
: 512 octets (par défaut) -
k
: 1 Ko -
M
: 1 Mo -
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/*'