unix-cli-best-practices

Par flutter · skills

Modèles de ligne de commande sûrs, portables et efficaces pour les outils Unix macOS/BSD (grep, find, sed, awk, xargs, mdfind, pbcopy, open) et leurs alternatives modernes (ripgrep, fd). Couvre les cas d'usage courants en shell scripting et en one-liners : recherche rapide, traitement de texte, navigation dans une base de code et exécution parallèle.

npx skills add https://github.com/flutter/skills --skill unix-cli-best-practices

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. Utilisez rg -i 'term' pour une insensibilité à la casse stricte.
  • Exécutez rg -g '*.ts' -g '!*.spec.ts' 'term' pour chercher dans les fichiers .ts tout 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 avec rg -0 pour 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. Utilisez rg -B 2 pour le contexte précédent ou rg -A 2 pour 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 txt pour filtrer les résultats par extensions de fichier.
  • Exécutez fd -t d 'docs' pour trouver des répertoires. Utilisez fd -t f pour les fichiers et fd -t l pour les liens symboliques.
  • Exécutez fd -H pour inclure les fichiers cachés, ou fd -I pour inclure les fichiers ignorés (comme node_modules). Combinez avec fd -HI pour 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 rm pour 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 :

  • -r ou -R pour rechercher récursivement. -R suit les liens symboliques, tandis que -r ne les suit pas.
  • -I pour 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.
  • -l pour afficher uniquement les noms des fichiers contenant des correspondances.
  • -Z pour 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 mdfind pour 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 pbcopy et pbpaste pour 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 open pour 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

Skills similaires