• No se han encontrado resultados

Presentación de las principales herramientas de Linu

Este capítulo presenta una serie de herramientas de Linux que todo usuario debería conocer. A menudo basta con una línea de comandos adecuada para efectuar los mismos tratamientos que un centenar de clics de ratón con un administrador de archivos gráfico. Al finalizar este capítulo el lector sabrá, entre otras cosas:

 buscar archivos según ciertos criterios y aplicarles un tratamiento;

 filtrar el contenido de archivos y las salidas de comandos con expresiones regulares;

 ordenar y separar datos;

 ver parcialmente el contenido de archivos.

1. find

El comando find permite buscar, en uno o más árboles de directorios, archivos que respondan a ciertos criterios y aplicarles un tratamiento según una acción determinada. La sintaxis global del comando es:

find ruta(s) parámetro(s) acción

La sintaxis del comando find no sigue las reglas elementales de sintaxis de los comandos de Linux descritos en el capítulo Inicio de sesión y primeros comandos.

a. Ruta de búsqueda

Se especifica en el comando find una o más rutas de búsqueda; estas rutas son directorios del sistema de archivos y find se encarga de recorrer todo el árbol subyacente en busca de archivos.

Si no se especifica una ruta, find inicia su búsqueda en el directorio actual: $ ls -R

.:

archivo1 archivo2 dir1 dir2

./dir2: $ find . ./dir2 ./dir1 ./archivo2 ./archivo1 $ find . . ./dir2 ./dir1 ./archivo2 ./archivo1

Cuando se especifican varias rutas, se separan con espacios: $ find /var/spool/mail . /etc/skel

/var/spool/mail /var/spool/mail/alan /var/spool/mail/linus /var/spool/mail/richard /var/spool/mail/gordon /var/spool/mail/eric /var/spool/mail/rpc /var/spool/mail/ken /var/spool/mail/dennis /var/spool/mail/nicolas . ./dir2 ./dir1 ./archivo2 ./archivo1 /etc/skel /etc/skel/.gnome2 /etc/skel/.bashrc /etc/skel/.bash_logout /etc/skel/.mozilla /etc/skel/.mozilla/plugins /etc/skel/.mozilla/extensions /etc/skel/.bash_profile

b. Expresiones de selección

Los criterios de selección, o expresiones, empiezan con un - (guión) seguido por sus parámetros.

Por ejemplo, la expresión -name nomarc pide al comando find que busque sólo los archivos cuyo nombre sea nomfic. La línea de comando completa, para una búsqueda en todo el árbol de Linux, es:

find / -name nomarc 2>/dev/null

Un usuario normal no tiene los permisos suficientes para acceder a todos los archivos presentes en el sistema. Como por lo general sólo se buscan los archivos a los que se puede acceder, habitualmente se suprimen los mensajes de error del comando find

debidos a esta falta de permiso de acceso, redirigiendo la salida de errores estándar al archivo /dev/null.

El comando find cuenta con un gran número de parámetros de selección; veremos a continuación las principales expresiones.

-name motivo

El parámetro -name afecta al nombre de los archivos presentes en los árboles de búsqueda.

El motivo puede contener los mismos caracteres genéricos de reemplazo que el shell, pero el comando find debe interpretarlos; por ello, el motivo se pone generalmente entre apóstrofes para inhibir la interpretación del shell.

Por ejemplo, los archivos cuyo nombre empieza por una s en el árbol subyacente de /usr:

$ find /usr -name ’s*’ 2>/dev/null /usr/src /usr/libexec/perf-core/scripts /usr/libexec/perf-core/scripts/python/sctop.py /usr/libexec/perf-core/scripts/python/syscall-counts-by-pid.pyc /usr/libexec/perf-core/scripts/python/syscall-counts-by-pid.py /usr/libexec/perf-core/scripts/python/syscall-counts-by-pid.pyo /usr/libexec/perf-core/scripts/python/syscall-counts.pyo /usr/libexec/perf-core/scripts/python/syscall-counts.py /usr/libexec/perf-core/scripts/python/bin/syscall-counts-by-pid- report /usr/libexec/perf-core/scripts/python/bin/syscall-counts-report ... -size [+-]<tamaño>(bck)

La expresión -size determina el tamaño de los archivos que se quieren buscar.

El tamaño de los archivos se indica en número de bloques, precedido eventualmente del signo + o -; eso significa:

-size 12

archivos que usan exactamente doce bloques de datos, por tanto un tamaño comprendido entre 11 y 12 bloques.

-size - 12

archivos que usan menos de doce bloques de datos, por tanto de un tamaño estrictamente inferior a 12 bloques.

-size +12

archivos que usan más de doce bloques de datos, por tanto de un tamaño estrictamente superior a 12 bloques.

Los bloques de datos tienen un tamaño predeterminado de 512 bytes, pero la unidad puede especificarse añadiendo el carácter b, c, k, M o G justo después del tamaño:

b bloques de datos de 512 bytes (valor predeterminado).

k, M o G bloques de datos de 1 KB, 1 MB o 1 GB.

Por ejemplo, los archivos cuyo tamaño es de 10 KB en el árbol /usr: $ find /usr -size 10k 2>/dev/null

/usr/libexec/ck-get-x11-server-pid /usr/libexec/nm-avahi-autoipd.action /usr/libexec/pulse/proximity-helper /usr/libexec/mission-control-5 /usr/libexec/udisks-helper-drive-detach ... $ ls -l /usr/libexec/ck-get-x11-server-pid

-rwxr-xr-x. 1 root root 9920 6 oct 00:32 /usr/libexec/ck-get-x11- server-pid

$ ls -l /usr/libexec/nm-avahi-autoipd.action

-rwxr-xr-x. 1 root root 9300 15 oct 21:24 /usr/libexec/nm-avahi- autoipd.action

$ ls -l /usr/libexec/pulse/proximity-helper -rwsr-xr-x. 1 root root 9596 23 feb 2010 /usr/libexec/pulse/proximity-helper $ ls -l /usr/libexec/mission-control-5

-rwxr-xr-x. 1 root root 10120 9 oct 00:34 /usr/libexec/mission- control-5

$ ls -l /usr/libexec/udisks-helper-drive-detach

-rwxr-xr-x. 1 root root 9944 19 may 2010 /usr/libexec/udisks- helper-drive-detach

-mtime [+-]<días>

La expresión -mtime especifica la fecha de la última modificación de los archivos buscados en número de días.

Como en el parámetro -size, el número de días puede ir precedido de los signos - y +:

-mtime 3 archivos modificados hace 3 días, o sea entre 72 horas (3 x 24 horas)

y 96 horas (4 x 24 horas).

-mtime - 3

archivos modificados hace menos de 3 días, o sea menos de 72 horas (3 x 24 horas).

-mtime +3

archivos modificados hace más de 3 días, o sea más de 96 horas (4 x 24 horas).

-perm <permisos>

Esta expresión permite recuperar todos los archivos con permisos de acceso particulares.

Los permisos pueden indicarse en notación octal o simbólica, por ejemplo: $ find /etc -perm 700 2>/dev/null

/etc/lvm /etc/cups/ssl

/etc/selinux/targeted/modules/active /etc/pki/CA/private

/etc/polkit-1/localauthority

$ find /etc -perm u=rwx 2>/dev/null /etc/lvm /etc/cups/ssl /etc/selinux/targeted/modules/active /etc/pki/CA/private /etc/sssd /etc/polkit-1/localauthority $ ls -ld /etc/lvm

drwx---. 5 root root 4096 18 feb 11:05 /etc/lvm $ ls -ld /etc/cups/ssl

drwx---. 2 root lp 4096 17 sept 18:30 /etc/cups/ssl $ ls -ld /etc/selinux/targeted/modules/active

drwx---. 3 root root 4096 18 feb 17:31 /etc/selinux/targeted/modules/active $ ls -ld /etc/pki/CA/private

drwx---. 2 root root 4096 30 jun 2010 /etc/pki/CA/private $ ls -ld /etc/sssd

drwx---. 3 root root 4096 18 feb 11:07 /etc/sssd $ ls -ld /etc/polkit-1/localauthority

drwx---. 7 root root 4096 18 feb 11:01 /etc/polkit-1/localauthority -newer <archivo>

La expresión -newer busca todos los archivos con una fecha de modificación más reciente que el archivo de referencia pasado como parámetro.

Este parámetro de selección es muy práctico para efectuar copias de seguridad

incrementales (guardar únicamente archivos modificados después de la última copia): $ touch ref

$ ls -l total 8

-rw-r--r--. 1 nicolas users 0 23 feb. 09:10 archivo1 -rw-r--r--. 1 nicolas users 0 23 feb. 09:10 archivo2 -rw-r--r--. 1 nicolas users 0 23 feb. 09:26 ref drwxr-xr-x. 2 nicolas users 4096 23 feb. 09:09 dir1 drwxr-xr-x. 2 nicolas users 4096 23 feb. 09:09 dir2 $ find . -newer ref

$ echo texto >> archivo1 $ find . -newer ref ./archivo1

-user <usuario>

Este parámetro permite recuperar todos los archivos pertenecientes a un mismo usuario. El parámetro puede ser el login o el UID del usuario:

$ id nicolas

uid=500(nicolas) gid=100(users) grupos=100(users) $ find /var -user nicolas 2> /dev/null

/var/cache/gdm/nicolas /var/cache/gdm/nicolas/dmrc /var/spool/mail/nicolas

$ find /var -user 500 2> /dev/null /var/cache/gdm/nicolas

/var/spool/mail/nicolas -group <grupo>

Al igual que la expresión anterior, -group permite buscar todos los archivos pertenecientes a un mismo grupo de usuarios.

De nuevo, se puede indicar indiferentemente el nombre del grupo o su GID.

c. Operadores sobre las expresiones

Las expresiones se evalúan como operaciones booleanas: devuelven verdadero o falso. Es posible combinar varias expresiones; para ello, existe una serie de operadores. -and o -a

Colocado entre dos expresiones, el operador -and (o -a) efectúa un Y lógico entre las dos expresiones.

El operador -and se utiliza de modo predeterminado cuando no se indica ningún operador. La sintaxis expresión1 -and expresión2 equivale a expresión1 expresión2. Por ejemplo, para buscar todos los archivos que pertenecen al usuario nicolas y cuyo nombre empieza por s en el directorio /tmp:

$ find /tmp -user nicolas -and -name ’s*’ 2> /dev/null /tmp/keyring-6wqI14/ssh

/tmp/sv6h.tmp

/tmp/.esd-500/socket

$ find /tmp -user nicolas -name ’s*’ 2> /dev/null /tmp/keyring-6wqI14/ssh

/tmp/sv6h.tmp

/tmp/.esd-500/socket -or u -o

Este operador efectúa un O lógico entre dos expresiones.

Por ejemplo, para buscar todos los archivos que pertenecen al usuario nicolas y cuyo nombre empieza por s en el directorio /tmp:

$ find /tmp -user nicolas -or -name ’s*’ 2> /dev/null /tmp/keyring-6wqI14 /tmp/keyring-6wqI14/gpg /tmp/keyring-6wqI14/pkcs11 /tmp/keyring-6wqI14/ssh /tmp/keyring-6wqI14/control /tmp/OSL_PIPE_500_SingleOfficeIPC_78d1f4adfd9e62660b247a5f42d4d7c /tmp/virtual-nicolas.MyGDbR /tmp/.ICE-unix/1758 /tmp/virtual-nicolas.fpLGsV ...

-not o !

El operador -not (o !) es la negación lógica. Debe colocarse justo antes de la expresión correspondiente.

Por ejemplo, para buscar todos los archivos cuyo nombre no empieza por s en el directorio /tmp:

$ find /tmp -not -name ’s*’ 2>/dev/null /tmp /tmp/keyring-6wqI14 /tmp/keyring-6wqI14/gpg /tmp/keyring-6wqI14/pkcs11 /tmp/keyring-6wqI14/control /tmp/OSL_PIPE_500_SingleOfficeIPC_78d1f4adfd9e62660b247a5f42d4d7c /tmp/alan /tmp/virtual-nicolas.MyGDbR /tmp/.X11-unix /tmp/.X11-unix/X0 ... Los paréntesis

Los paréntesis permiten definir el orden de los operadores lógicos. Se colocan antes y después de un conjunto de expresiones para formar una sola a nivel lógico.

Los paréntesis tienen un significado particular para el shell, por lo que hay que protegerlos con el carácter de cita \ (barra invertida).

Por ejemplo:

$ find /tmp -not -name ’s*’ -or -user nicolas 2>/dev/null /tmp /tmp/keyring-6wqI14 /tmp/keyring-6wqI14/gpg /tmp/keyring-6wqI14/pkcs11 /tmp/keyring-6wqI14/ssh /tmp/keyring-6wqI14/control /tmp/OSL_PIPE_500_SingleOfficeIPC_78d1f4adfd9e62660b247a5f42d4d7c /tmp/alan /tmp/virtual-nicolas.MyGDbR /tmp/.X11-unix ...

$ find /tmp -not \( -name ’s*’ -or -user nicolas \) 2>/dev/null /tmp /tmp/alan /tmp/.X11-unix /tmp/.X11-unix/X0 /tmp/vmware-root /tmp/.ICE-unix /tmp/pulse-FDPK5kbTSV2P /tmp/pulse-PKdhtXMmr18n /tmp/archive.tar.gz /tmp/orbit-gdm ...

En el primer ejemplo, se enumeran los archivos cuyo nombre no empieza por s o que pertenecen a nicolas. En el segundo ejemplo, no se enumeran ni los archivos que empiezan por s, ni los que pertenecen a nicolas.

d. Acciones