Manipulación de archivos y redirección en Bash
Vamos a ver como crear, mover, copiar, eliminar archivos y visualizar su contenido, junto con técnicas de redirección, comandos encadenados y el manejo de flujos estándar.
Comandos para gestionar archivos
Estos comandos permiten copiar, mover y eliminar archivos y directorios:
cp archivo_origen archivo_destinoCopia un archivo de un lugar a otro.
cp ./documento.txt ~/Documentos/copiaria documento.txt (si estas en su misma carpeta) a la capeta Documentos de tu usuariocp -r carpeta_origen carpeta_destinoCopia una carpeta completa.mv archivo_origen archivo_destinoMueve o renombra un archivo.mv carpeta_origen carpeta_destinoMueve un directorio.rm archivoElimina un archivo.rm -r carpetaBorra una carpeta y todo su contenido.
Ejemplo práctico:
Para hacer una copia de seguridad de un documento antes de modificarlo:
cp informe.txt informe_backup.txt
Si deseas mover todos los archivos .jpg a una carpeta llamada "Fotos":
mv *.jpg Fotos/
Visualización del contenido de archivos
Estos comandos permiten inspeccionar el contenido de archivos sin necesidad de abrirlos en un editor:
cat archivo.txtMuestra todo el contenido del archivo.less archivo.txtPermite desplazarse por el contenido con las flechas.head -n 10 archivo.txtMuestra las primeras 10 líneas.tail -n 10 archivo.txtMuestra las últimas 10 líneas.
Ejemplo práctico:
Si quieres ver las primeras líneas de un archivo de registros:
head -n 20 log.txt
Para monitorear un archivo de registros en tiempo real:
tail -f log.txt
Redirección de entrada y salida
Redirigir la salida de comandos a archivos o modificar el flujo de datos permite automatizar procesos.
comando > archivo.txtRedirige la salida estándar, sobrescribiendo el archivo.comando >> archivo.txtAñade la salida al final del archivo.comando < archivo.txtUsa el contenido de un archivo como entrada.comando 2> error.txtGuarda solo los errores en un archivo.comando &> archivo.txtRedirige la salida estándar y los errores al mismo archivo.
stdout y stderr Flujos de salida estándar
Cuando ejecutamos comandos en Bash, los resultados pueden aparecer en dos flujos distintos:
- `stdout` (Standard Output) La salida estándar del comando.
- `stderr` (Standard Error) Mensajes de error generados por el comando.
Ejemplo práctico:
Si ejecutamos:
ls /home/user/
Los archivos listados aparecen en `stdout`. Pero si ejecutamos:
ls /directorio_inexistente
El mensaje de error se imprimirá en `stderr`.
Redirección específica de stdout y stderr:
ls > archivos.txtGuarda solo la salida estándar en un archivo.ls /directorio_inexistente 2> errores.txtGuarda solo los errores en un archivo.ls /home/user &> salida.txtGuarda `stdout` y `stderr` en el mismo archivo.comando 2>/dev/nullDescarta los errores sin mostrarlos.
Pipes (|) y encadenamiento de comandos
El operador | permite encadenar comandos, enviando la salida de uno como entrada del siguiente.
ls -l | lessMuestra los archivos con paginación.cat archivo.txt | grep "error"Filtra líneas que contienen "error".ps aux | grep firefoxBusca procesos relacionados con Firefox.df -h | grep "/dev/sd"Filtra información sobre discos montados.ls -l | moreMuestra la salida del comando pantalla por pantalla y solo avanzará cuando presiones Espacio o Enter.
Ejemplo práctico:
Para listar archivos ordenados por tamaño de forma legible:
ls -lhS | less
Si necesitas ver los procesos de tu sistema ordenados por consumo de memoria:
ps aux | sort -k4 -nr | head
Opciones (flags)
Habrás observado que algunos comandos admiten las mismas opciones:
-ro-R(recursivo) Se usa en comandos como cp, mv y rm para trabajar con directorios completos.-i (interactivo)Enrm,mv, ycppide confirmación antes de sobrescribir o eliminar archivos.-f(forzar): enrmymvevita las confirmaciones y fuerza la acción.-v(verbose): encp,mv, yrmmuestra información detallada de cada operación.-h(human-readable): Enls,df, ydu, muestra tamaños en formatos comprensibles (KB, MB, GB).-a(todos los archivos): Enlsycp, incluye archivos ocultos (.).
En Bash, puedes escribir varias opciones juntas (-iR) o separadas (-i -R) y el comportamiento es el mismo:
cp -iR carpeta_origen carpeta_destino
cp -i -R carpeta_origen carpeta_destino
# es lo mismo