Linux commande find

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 fichier
1
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/dossier par ton dossier de départ
  • dossier_exclu par le (ou les) dossier(s) à exclure
  • fichier_exclu.ext par le (ou les) fichier(s) à exclure
  • SEQUENCE par 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 ![](/images/%20et%20la%20chaine%20) 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'
linux find , chercher les derniers fichiers modifiés récursivement en excluant certains répertoires

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.txt

Pour 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) ?