Ir al contenido

fd - Alternativa Rápida y Amigable para Find

fd - Alternativa Rápida y Amigable para Find

Instalación

PlatformComando
Ubuntu/Debiansudo apt install fd-find (binary: fdfind)
Arch Linuxsudo pacman -S fd
Fedora/RHELsudo dnf install fd-find
Alpine Linuxapk add fd
macOS (Homebrew)brew install fd
macOS (MacPorts)sudo port install fd
Windows (Scoop)scoop install fd
Windows (Chocolatey)choco install fd
Windows (Winget)winget install sharkdp.fd
Cargo (All platforms)cargo install fd-find
Snapsudo snap install fd

Comandos Básicos

ComandoDescripción
fd filenameBuscar archivos/directorios que coincidan con “filename”
fd pattern /pathBuscar patrón en directorio específico
fd -e txtEncontrar todos los archivos con extensión .txt
fd -e js -e tsEncontrar archivos con múltiples extensiones (.js o .ts)
fd -t f patternEncontrar solo archivos (no directorios)
fd -t d dirnameEncontrar solo directorios
fd -t xEncontrar solo archivos ejecutables
fd -t lEncontrar solo enlaces simbólicos
fd -s PatternBúsqueda sensible a mayúsculas y minúsculas (por defecto es insensible a mayúsculas y minúsculas)
fd -d 3 patternLimitar la profundidad de búsqueda a 3 niveles
fd -H patternIncluir archivos ocultos en la búsqueda
fd -I patternNo respetar las reglas de .gitignore
fd -a patternMostrar rutas absolutas en lugar de rutas relativas
fd -l patternShow detailed listing (like ls -l)
fd -0 patternUse null separator (for piping to xargs -0)

Uso Avanzado

ComandoDescripción
fd '^test.*\.js$'Usar patrón regex (archivos que comienzan con “test”, que terminan con .js)
fd -g '*.{js,ts}'Utiliza patrones glob en lugar de regex
fd -F 'exact.string'Búsqueda de cadena fija (sin interpretación de regex)
fd -E node_modules -E '*.tmp' patternExcluir patrones específicos de la búsqueda
fd --no-ignore patternNo utilices archivos .gitignore, .fdignore o .ignore
fd -L patternSeguir enlaces simbólicos durante la búsqueda
fd --changed-within 2dArchivos modificados en los últimos 2 días
fd --changed-before 30dArchivos no modificados en los últimos 30 días
fd --size +100mArchivos mayores de 100MB
fd --size +10m --size -100mArchivos entre 10MB y 100MB
fd --owner usernameArchivos propiedad de usuario específico
fd --max-results 100Limitar la salida a 100 resultados
fd -x rm {}Ejecutar comando en cada resultado (eliminar archivos)
fd -X convert {} {.}.pngEjecutar comando con múltiples argumentos (conversión por lotes)
fd --color never patternDeshabilitar salida coloreada
fd --strip-cwd-prefix patternRemove ./ prefix from results
fd -H -t d "^\."Encontrar directorios ocultos (que comienzan con punto)
fd -t f -x du -h {}Mostrar tamaños de archivos para todas las coincidencias
fd pattern --threads 1Usar single thread (para debugging)
fd --base-directory /path patternCambiar directorio base para búsqueda

Configuración

Archivos de Configuración

Ubicaciones de archivos de ignorados globales:

  • Linux/macOS:~/.config/fd/ignoreo~/.fdignore
  • Windows:%APPDATA%\fd\ignore

Específico del proyecto:.fdignoreen la raíz del proyecto

Ejemplo de Archivo .fdignore

# Ignore dependency directories
node_modules/
vendor/
target/

# Ignore build outputs
build/
dist/
*.o
*.pyc

# Ignore IDE directories
.idea/
.vscode/
*.swp

# Ignore log files
*.log
logs/

# Ignore temporary files
*.tmp
*~
.DS_Store

# Ignore specific paths
/cache/
/tmp/

Variables de Entorno

# Set default options for all fd commands
export FD_OPTS="--hidden --follow --exclude .git"

# Control colorization (fd respects LS_COLORS)
export LS_COLORS="di=34:ln=35:ex=31:*.txt=33"

Alias Útiles

# Add to ~/.bashrc or ~/.zshrc

# Search including hidden files
alias fdh='fd -H'

# Search ignoring .gitignore
alias fda='fd -I'

# Find large files
alias fdl='fd --size +100m'

# Find recent files (last 24 hours)
alias fdr='fd --changed-within 1d'

# Find and preview with fzf and bat
alias fdf='fd -t f | fzf --preview "bat --color=always {}"'

# Find and edit with vim
alias fdv='fd -t f | fzf | xargs -r vim'

Casos de Uso Comunes

Caso de Uso 1: Limpiar Artefactos de Compilación

# Remove all Python compiled files
fd -e pyc -e pyo -x rm {}

# Remove all node_modules directories (up to 2 levels deep)
fd -t d -d 2 '^node_modules$' -x rm -rf {}

# Clean old log files (older than 30 days)
fd -e log --changed-before 30d -x rm {}

# Remove all temporary files
fd -g '*.tmp' -g '*~' -g '*.swp' -x rm {}

Caso de Uso 2: Búsqueda y Análisis de Código

# Find all JavaScript/TypeScript files modified in last week
fd -e js -e ts -e jsx -e tsx --changed-within 7d

# Count lines of code in Rust project
fd -e rs -x wc -l {} | awk '{sum+=$1} END {print sum}'

# Find all TODO comments in Python files
fd -e py -x grep -Hn "TODO:" {}

# Find largest source files
fd -e java -e kt -x du -h {} | sort -hr | head -20

# Find files containing specific function name
fd -e cpp -e hpp -x grep -l "myFunction" {}

Caso de Uso 3: Gestión de Archivos de Registro

# Find and compress logs older than 7 days
fd -e log --changed-before 7d -x gzip {}

# Search for errors in recent logs
fd -e log --changed-within 1d -x grep -i "error" {} \;

# Find large log files (over 100MB)
fd -e log --size +100m -l

# Archive old logs to separate directory
fd -e log --changed-before 30d -x mv {} /archive/logs/

Caso de Uso 4: Gestión de Docker y Contenedores

# Find all Dockerfiles in project
fd -g '*Dockerfile*' -g 'Dockerfile.*'

# Find all docker-compose files
fd -g 'docker-compose*.yml' -g 'docker-compose*.yaml'

# Find and validate Dockerfiles
fd '^Dockerfile$' -x docker build --dry-run -f {} .

# Find container-related configs
fd -e yml -e yaml -x grep -l "kind:" {} \;

Caso de Uso 5: Auditoría de Seguridad y Permisos

# Find world-writable files (security risk)
fd -t f -x sh -c 'test -w {} && ls -l {}'

# Find SUID/SGID binaries
fd -t x -x sh -c 'test -u {} -o -g {} && ls -l {}'

# Find files with passwords in name
fd -i password -i passwd -i secret

# Find configuration files with potential secrets
fd -g '*.conf' -g '*.cfg' -g '*.ini' -x grep -i "password\|secret\|key" {}

# Find SSH keys
fd -g 'id_rsa*' -g 'id_ed25519*' -H

Mejores Prácticas

  • Usar archivos.fdignore: Crear patrones de ignorados específicos del proyecto para acelerar búsquedas y reducir ruido
  • Aprovechar valores predeterminados inteligentes:fdrespeta automáticamente

Would you like me to fill in the remaining placeholders with specific translations?.gitignore- usar-Isolo cuando necesites archivos ignorados

  • Combinar con otras herramientas: Canalizarfdsalida axargs,grep,fzfpara flujos de trabajo potentes
  • Usar-0conxargs: Siempre usarfd -0 | xargs -0para nombres de archivos con espacios o caracteres especiales
  • Preferir-xsobre tuberías: Usarfd -x command {}en lugar de canalizar axargspara un mejor rendimiento
  • Establecer límites de profundidad: Usar-dbandera en árboles de directorios grandes para prevenir recursión excesiva
  • Usar filtros de tipo específicos: Filtrar por tipo (-t f,-t d) temprano para reducir el espacio de búsqueda
  • Crear alias: Configurar alias de shell para patrones defdfrecuentemente usados para ahorrar escritura
  • Combinar filtros de tiempo y tamaño: Usar--changed-withiny--sizejuntos para seleccionar archivos con precisión
  • Probar patrones de regex: Usar probadores de regex en línea antes de búsquedasfdcomplejas para verificar patrones

Resolución de problemas

ProblemaSolución
Command not found: fdOn Debian/Ubuntu, binary is fdfind. Create symlink: ln -s $(which fdfind) ~/.local/bin/fd
Too many resultsUse depth limit -d 3, exclude patterns -E node_modules, or filter by type -t f
Not finding hidden filesAdd -H flag to include hidden files, or -HI to also ignore .gitignore rules
Search is too slowReduce depth with -d, exclude large directories with -E, or use --threads to control parallelism
Regex not matchingRemember fd uses case-insensitive search by default. Use -s for case-sensitive or -F for literal strings
Files in .gitignore showing upThis shouldn’t happen by default. Check for -I or --no-ignore flags in aliases or FD_OPTS
Special characters in filenames breaking commandsUse -0 with xargs -0 or use -x flag instead: fd pattern -x command {}
Cannot execute command on resultsCheck if using correct syntax: -x for individual execution, -X for batch execution
Color output in logs/filesDisable with --color never or redirect stderr: fd pattern 2>/dev/null
Permission denied errorsRedirect stderr to ignore: fd pattern 2>/dev/null or run with appropriate permissions
Not respecting .fdignore fileEnsure .fdignore is in project root or ~/.config/fd/ignore. Check file syntax matches .gitignore format