Linux commande find
Notes › _DIFFUSION › Linux cli scripts
find chercher une chaine complexe(séquence échappement) dans les fichiers d'un dossier avec récursivité, exclusion dossier et fichier1
2
3
4
5
find /chemin/dossier \
-type f \
! -path '/chemin/dossier/dossier_exclu/*' \
! -name 'fichier_exclu.ext' \
-exec sh -c 'grep -nH --binary-files=without-match -- "SEQUENCE" "$@"' _ {} +
Remplace :
/chemin/dossierpar ton dossier de départdossier_exclupar le (ou les) dossier(s) à exclurefichier_exclu.extpar le (ou les) fichier(s) à exclureSEQUENCEpar ta chaîne
Exclure plusieurs dossiers :
1
2
3
4
find /chemin/dossier -type f \
! -path '/chemin/dossier/dossier1/*' \
! -path '/chemin/dossier/dossier2/*' \
-exec sh -c 'grep -nH --binary-files=without-match -- "SEQUENCE" "$@"' _ {} +
Remplacer une chaîne par une autre
linux cli find comment remplacer la chaine ![]/images/ par  par ) dans tous fichiers de type mdou txt à l’intérieur d’un dossier
Commande à exécuter sur Linux
1
Linux pc1 7.0.12-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 10 Jun 2026 08:58:02 +0000 x86_64 GNU/Linux
Remplace /CHEMIN/DU/DOSSIER par le dossier cible
1
2
3
4
5
DOSSIER='/CHEMIN/DU/DOSSIER'
find $DOSSIER -type f \( -name '*.md' -o -name '*.txt' \) -print0 |
xargs -0 sed -i \
-e 's/!\[\[/![]\/images\//g' \
-e 's/\]\]/)/g'
Cette commande est récursive , dossier et sous- dossier
find /CHEMIN/DU/DOSSIER ... descend récursivement dans tous les sous-dossiers, et -type f ne traite que les fichiers réguliers .md et .txt
Exemple:
1
2
3
4
5
DOSSIER='/home/yann/media/Notes'
find $DOSSIER -type f \( -name '*.md' -o -name '*.txt' \) -print0 |
xargs -0 sed -i \
-e 's/!\[\[/![]\/images\//g' \
-e 's/\]\]/)/g'
Pour exclure tous les répertoires cachés (commençant par un .), pas seulement des noms spécifiques :
Solution avec -name ".*"
1
2
3
4
find /chemin/racine \
-type d -name ".*" -prune -o \
-type f -printf '%T@ %p\n' \
| sort -rn | head -20
Explication :
-type d -name ".*" -prune: coupe la descente dans tout répertoire dont le nom commence par un point (.git,.cache,.config, etc.)- Le reste fonctionne comme avant : liste les fichiers avec leur timestamp, trie par date décroissante, garde les 20 plus récents
Combiner avec d’autres exclusions (ex: node_modules)
1
2
3
4
find /chemin/racine \
\( -type d -name ".*" -o -type d -name "node_modules" \) -prune -o \
-type f -printf '%T@ %p\n' \
| sort -rn | head -20
Version lisible (date + heure)
1
2
3
4
find /chemin/racine \
-type d -name ".*" -prune -o \
-type f -printf '%TY-%Tm-%Td %TH:%TM %p\n' \
| sort -r | head -20
Attention au dossier racine lui-même
Si /chemin/racine commence lui-même par un point (par exemple tu lances la commande depuis ~/.config), cette règle l’exclurait aussi. Dans ce cas, précise le chemin absolu du dossier de départ plutôt que de faire find . depuis l’intérieur d’un dossier caché — ou utilise -mindepth 1 pour ne pas évaluer le point de départ :
1
2
3
4
find /chemin/racine -mindepth 1 \
-type d -name ".*" -prune -o \
-type f -printf '%T@ %p\n' \
| sort -rn | head -20
Cette dernière version est la plus sûre en général.
avec fichier exclude.txtPour lire la liste des répertoires à exclure depuis un fichier exclude.txt (un motif par ligne, ex: node_modules, .git, vendor) :
Méthode 1 : construire dynamiquement les -name/-prune
1
2
3
4
5
find /chemin/racine \
\( -type d -name ".*" \) -o \
\( $(while read -r pattern; do printf '-name "%s" -o ' "$pattern"; done < exclude.txt | sed 's/ -o $//') \) -prune -o \
-type f -printf '%T@ %p\n' \
| sort -rn | head -20
C’est fragile (echappement, espaces). Plus robuste : script shell explicite.
Méthode 2 (recommandée) : construire un tableau d’arguments
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
EXCLUDE_ARGS=()
first=1
while IFS= read -r pattern; do
[ -z "$pattern" ] && continue
if [ $first -eq 1 ]; then
EXCLUDE_ARGS+=(-name "$pattern")
first=0
else
EXCLUDE_ARGS+=(-o -name "$pattern")
fi
done < exclude.txt
find /chemin/racine \
\( -type d \( "${EXCLUDE_ARGS[@]}" -o -name ".*" \) -prune \) -o \
-type f -printf '%T@ %p\n' \
| sort -rn | head -20
Contenu type de exclude.txt :
1
2
3
4
5
node_modules
vendor
target
build
dist
(pas besoin d’y mettre les dossiers cachés puisqu’ils sont déjà exclus via -name ".*")
Méthode 3 : plus simple avec grep -vFf en filtrant après coup
Si tu préfères filtrer les chemins après la recherche plutôt que de bidouiller -prune :
1
2
3
4
find /chemin/racine -type f -printf '%T@ %p\n' \
| grep -vFf <(sed 's|^|/|' exclude.txt) \
| grep -v '/\.[^/]*/' \
| sort -rn | head -20
Ici exclude.txt contient des fragments de chemin (ex: /node_modules/, /vendor/), et grep -vFf élimine toute ligne contenant un de ces motifs. C’est moins performant (parcourt tout l’arbre avant de filtrer) mais beaucoup plus simple à écrire et maintenir.
Recommandation
Si exclude.txt est amené à évoluer souvent et que la liste est courte, je te conseille la méthode 3 (simple, lisible, facile à déboguer). Si tu veux de la performance sur un très gros arbre de fichiers (éviter de descendre dans les dossiers exclus), pars sur la méthode 2.
Veux-tu que je t’écrive un petit script complet et testable, avec gestion des espaces dans les noms de fichiers (-print0 / sort -z) ?