Bonnes pratiques Unix CLI
Ce guide fournit des techniques efficaces, sûres et portables pour manipuler du texte et trouver des fichiers en ligne de commande sur macOS. Par défaut, macOS utilise des utilitaires UNIX dérivés de BSD (grep, find, sed, awk) qui présentent des différences subtiles avec leurs homologues GNU/Linux.
Lorsque c'est possible, utilisez des remplaçants haute performance (ripgrep et fd) qui respectent les règles .gitignore par défaut et offrent des interfaces plus ergonomiques.
Alternatives modernes haute performance
Utilisez ces outils à la place des utilitaires BSD standard pour les opérations sur la base de code locale.
ripgrep (rg)
Utilisez ripgrep (rg) comme outil préféré pour rechercher du texte. Il est plus rapide que grep standard et respecte les règles .gitignore par défaut.
Cas d'usage courants :
- Exécutez
rg 'search_term'pour effectuer une recherche récursive dans le répertoire courant. - Exécutez
rg -S 'term'pour une recherche insensible à la casse, sauf si la requête contient des majuscules. Utilisezrg -i 'term'pour une insensibilité à la casse stricte. - Exécutez
rg -g '*.ts' -g '!*.spec.ts' 'term'pour chercher dans les fichiers.tstout en excluant les fichiers.spec.ts. - Exécutez
rg -v 'ignore_me'pour afficher les lignes qui ne correspondent pas au motif. - Exécutez
rg -l 'term'pour lister uniquement les noms des fichiers correspondants. Combinez avecrg -0pour une sortie terminée par un null adaptée àxargs. - Exécutez
rg -F 'foo()'pour traiter le motif de recherche comme une chaîne fixe plutôt qu'une expression régulière. - Exécutez
rg -w 'const'pour correspondre uniquement aux mots complets. - Exécutez
rg -C 2 'term'pour afficher deux lignes de contexte environnant. Utilisezrg -B 2pour le contexte précédent ourg -A 2pour le contexte suivant.
Consultez rg --help pour la liste complète des options.
fd
Utilisez fd comme outil préféré pour traverser le système de fichiers et trouver des fichiers. Il est plus rapide que find standard et respecte les règles .gitignore par défaut.
Cas d'usage courants :
- Exécutez
fd 'pattern'pour trouver des fichiers correspondant au motif regex n'importe où dans leur chemin. - Exécutez
fd -e py -e txtpour filtrer les résultats par extensions de fichier. - Exécutez
fd -t d 'docs'pour trouver des répertoires. Utilisezfd -t fpour les fichiers etfd -t lpour les liens symboliques. - Exécutez
fd -Hpour inclure les fichiers cachés, oufd -Ipour inclure les fichiers ignorés (commenode_modules). Combinez avecfd -HIpour chercher tous les fichiers. - Exécutez
fd -p 'src/assets'pour faire correspondre le motif au chemin complet au lieu du seul nom de fichier. - Exécutez
fd -e log -x rmpour exécuter une commande sur chaque fichier correspondant individuellement. Utilisez-X(par exemple,fd -e log -X rm) pour exécuter la commande une fois avec tous les fichiers correspondants comme arguments. - Exécutez
fd -a 'pattern'pour retourner les chemins absolus au lieu des chemins relatifs.
Consultez fd --help pour la liste complète des options.
Outils intégrés pour macOS et BSD
Utilisez ces utilitaires intégrés uniquement quand rg et fd ne sont pas disponibles. Appliquez des filtres précis pour éviter la dégradation des performances.
Recherche efficace avec grep
N'utilisez pas grep | grep -v 'unwanted_dir' pour exclure des répertoires. Cette approche lit tous les fichiers avant de les filtrer. Utilisez plutôt des arguments d'exclusion natifs pour exclure des répertoires au niveau du système de fichiers :
# Lent : lit les fichiers binaires et ignorés
grep -R "pattern" . | grep -v "node_modules"
# Rapide : ignore complètement le répertoire au niveau du système de fichiers
grep -R --exclude-dir=node_modules --exclude-dir=.git "pattern" .
Drapeaux grep courants :
-rou-Rpour rechercher récursivement.-Rsuit les liens symboliques, tandis que-rne les suit pas.-Ipour ignorer les fichiers binaires pour une exécution plus rapide et une sortie propre.--exclude="*.min.js"pour ignorer les fichiers correspondant à un glob spécifique.--include="*.dart"pour rechercher uniquement dans les fichiers correspondant à un glob spécifique.-lpour afficher uniquement les noms des fichiers contenant des correspondances.-Zpour afficher un caractère null après chaque nom de fichier, utile lors du passage àxargs -0.
Exemple de suppression sécurisée de fichiers contenant une chaîne spécifique :
grep -rlZ -I --exclude-dir=node_modules "DEPRECATED_API" . | xargs -0 rm
Traversal haute performance avec find
Empêchez find de traverser les arbres de répertoires non pertinents en utilisant l'option -prune.
# Lent : traverse entièrement node_modules, puis filtre la sortie
find . -name "*.ts" | grep -v "node_modules"
# Rapide : ignore complètement node_modules
find . -name "node_modules" -prune -o -name "*.ts" -print
L'expression -name "node_modules" -prune arrête la traversal en rencontrant un répertoire node_modules. L'opérateur -o (OU) spécifie que pour tout autre répertoire ou fichier se terminant par .ts, le chemin est affiché.
Portabilité macOS avec sed
macOS utilise BSD sed, qui diffère de GNU sed dans sa gestion de l'édition in-place.
Utilisez l'option -i avec une extension de sauvegarde explicite. Pour éditer in-place sans créer de sauvegarde, fournissez une chaîne vide :
# Éditer in-place sans créer de sauvegarde
sed -i '' 's/oldName/newName/g' filename.txt
# Éditer in-place et créer une sauvegarde nommée filename.txt.bak
sed -i '.bak' 's/oldName/newName/g' filename.txt
Utilisez l'option -E pour activer les expressions régulières étendues, évitant d'échapper les parenthèses et les signes plus :
sed -E 's/(foo|bar)+/baz/g' file.txt
Analyse de la base de code avec awk
Utilisez awk pour l'extraction de données ligne par ligne et le traitement de texte.
Cas d'usage courants :
- Afficher des colonnes spécifiques à partir d'une entrée séparée par des espaces :
ls -l | awk '{print $1, $3}' - Trouver et afficher les lignes dupliquées dans un fichier sans les trier d'abord :
awk '!seen[$0]++' filename.txt - Filtrer les lignes en fonction des valeurs de colonne (par exemple, afficher les lignes où la troisième colonne est supérieure à 100) :
awk '$3 > 100' data.txt - Trouver les lignes correspondant à un motif et afficher leur numéro de ligne (
NR) ainsi que le contenu :awk '/Error/ {print NR, $0}' server.log
Pipelines sûrs et parallélisme avec xargs
Utilisez xargs pour construire et exécuter des commandes à partir de l'entrée standard. Utilisez toujours l'option -0 (terminée par null) lors du traitement de chemins de fichiers pour gérer en toute sécurité les noms de fichiers contenant des espaces ou des caractères spéciaux.
# Non sûr : échouera ou effectuera des actions non intentionnelles si les noms de fichiers contiennent des espaces
find . -name "*.log" | xargs rm
# Sûr : gère correctement les espaces et les caractères spéciaux
find . -name "*.log" -print0 | xargs -0 rm
Utilisez l'option -P pour exécuter les tâches en parallèle :
# Exécuter jusqu'à 4 processus curl en parallèle
cat urls.txt | xargs -n 1 -P 4 curl -O
Outils CLI spécifiques à macOS
Utilisez les utilitaires spécifiques à macOS pour interagir avec les fonctionnalités du système d'exploitation :
-
Utilisez
mdfindpour interroger l'index Spotlight de macOS pour des recherches de fichiers et de contenu rapides et globales sans scanner le disque :# Rechercher par nom de fichier mdfind -name "project_spec" # Rechercher par contenu textuel dans les fichiers mdfind "kMDItemTextContent == 'TODO: Refactor'" -
Utilisez
pbcopyetpbpastepour interagir avec le presse-papiers système :# Copier le contenu du fichier dans le presse-papiers cat ssh_key.pub | pbcopy # Coller le contenu du presse-papiers dans un fichier pbpaste > new_file.txt -
Utilisez
openpour ouvrir des fichiers, des répertoires ou des URL avec leurs applications par défaut :# Ouvrir le répertoire courant dans le Finder open . # Ouvrir un fichier HTML local avec une application spécifique open -a "Google Chrome" index.html