104.7 Lección 1
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
104 Dispositivos, sistemas de archivos Linux, estándar de jerarquía del sistema de archivos |
Objetivo: |
104.7 Buscar archivos del sistema y colocar archivos en la ubicación correcta |
Lección: |
1 de 1 |
Introducción
Las distribuciones de Linux vienen en todas las formas y tamaños, pero una cosa que casi todas comparten es que siguen el Filesystem Hierarchy Standard (FHS), que define un “diseño estándar” para el sistema de archivos, lo que facilita mucho la interoperación y la administración del sistema. En este tema, aprenderá más sobre este estándar y cómo encontrar archivos en un sistema Linux.
El estándar de jerarquía del sistema de archivos
El Estándar de jerarquía del sistema de archivos (FHS) es un esfuerzo de la Fundación Linux para estandarizar la estructura y el contenido del directorio en los sistemas Linux. El cumplimiento del estándar no es obligatorio, pero la mayoría de las distribuciones lo siguen.
Note
|
Aquellos interesados en los detalles de la organización del sistema de archivos pueden leer la especificación FHS 3.0, disponible en múltiples formatos en: http://refspecs.linuxfoundation.org/fhs.shtml |
Según el estándar, la estructura básica de directorios es la siguiente:
/
-
Este es el directorio raíz, el directorio más alto de la jerarquía. Todos los demás directorios se encuentran dentro de él. Un sistema de archivos a menudo se compara con un “árbol”, por lo que este sería el “tronco” al que están conectadas todas las ramas.
/bin
-
Binarios esenciales, disponibles para todos los usuarios.
/boot
-
Archivos necesarios para el proceso de arranque, incluido el disco RAM inicial (initrd) y el propio kernel de Linux.
/dev
-
Archivos de dispositivo. Estos pueden ser dispositivos físicos conectados al sistema (por ejemplo,
/dev/sda
sería el primer disco SCSI o SATA) o dispositivos virtuales proporcionados por el kernel. /etc
-
Archivos de configuración específicos del host. Los programas pueden crear subdirectorios en
/etc
para almacenar múltiples archivos de configuración si es necesario. /home
-
Cada usuario del sistema tiene un directorio “home” para almacenar archivos personales y preferencias, y la mayoría de ellos se encuentran en
/home
. Por lo general, el directorio de inicio es el mismo que el nombre de usuario, por lo que el usuario John tendría su directorio en/home/john
. Las excepciones son el superusuario (root), que tiene un directorio separado (/root
) y algunos usuarios del sistema. /lib
-
Se necesitan bibliotecas compartidas para arrancar el sistema operativo y ejecutar los archivos binarios en
/bin
y/sbin
. /media
-
Los medios extraíbles montables por el usuario, como unidades flash, lectores de CD y DVD-ROM, disquetes, tarjetas de memoria y discos externos se montan aquí.
/mnt
-
Punto de montaje para sistemas de archivos montados temporalmente.
/opt
-
Paquetes de software de aplicación.
/root
-
Directorio de inicio del superusuario (root).
/run
-
Datos variables en tiempo de ejecución.
/sbin
-
Binarios del sistema
/srv
-
Datos servidos por el sistema. Por ejemplo, las páginas servidas por un servidor web podrían almacenarse en
/srv/www
. /tmp
-
Archivos temporales.
/usr
-
Datos de usuario de solo lectura, incluidos los datos que necesitan algunas aplicaciones y utilidades secundarias.
/proc
-
Sistema de archivos virtual que contiene datos relacionados con los procesos en ejecución.
/var
-
Datos variables escritos durante el funcionamiento del sistema, incluida la cola de impresión, datos de registro, buzones de correo, archivos temporales, caché del navegador, etc.
Tenga en cuenta que algunos de esos
directorios, como /etc
, /usr
y /var
, contienen una
jerarquía completa de subdirectorios
debajo de ellos.
Buscar archivos
Para buscar archivos en un sistema
Linux, puede usar el comando find
.
Esta es una herramienta muy poderosa,
llena de parámetros que pueden adaptarse
a su comportamiento y modificar la
salida exactamente a sus necesidades.
Para empezar, find
necesita dos argumentos: un punto de
partida y qué buscar. Por ejemplo, para
buscar todos los archivos en el
directorio actual (y subdirectorios)
cuyos nombres terminan en .jpg
,
puede usar:
$ find . -name '*.jpg' ./pixel_3a_seethrough_1.jpg ./Mate3.jpg ./Expert.jpg ./Pentaro.jpg ./Mate1.jpg ./Mate2.jpg ./Sala.jpg ./Hotbit.jpg
Esto coincidirá con cualquier archivo
cuyos últimos cuatro caracteres del
nombre sean .jpg
, sin
importar lo que venga antes, ya que *
es un comodín para “cualquier cosa”. Sin
embargo, vea lo que sucede si se agrega
otro *
al final del
patrón:
$ find . -name '*.jpg*' ./pixel_3a_seethrough_1.jpg ./Pentaro.jpg.zip ./Mate3.jpg ./Expert.jpg ./Pentaro.jpg ./Mate1.jpg ./Mate2.jpg ./Sala.jpg ./Hotbit.jpg
El archivo Pentaro.jpg.zip
(resaltado arriba) no se incluyó en la
lista anterior, porque incluso si
contiene .jpg
en su
nombre, no coincidía con el patrón ya
que había caracteres adicionales después
de él. El nuevo patrón significa
“cualquier cosa .jpg
cualquier cosa”, por lo que coincide.
Tip
|
Tenga en cuenta que el
parámetro |
La expresión * .jpg
debe
colocarse entre comillas simples, para
evitar que el shell interprete el patrón
en sí. Pruebe sin las comillas y vea qué
sucede.
De forma predeterminada, find
comenzará en el punto de partida y
descenderá a través de los
subdirectorios (y subdirectorios de esos
subdirectorios) que se encuentren. Puede
restringir este comportamiento con los
parámetros -maxdepth N
,
donde N
es el número
máximo de niveles.
Para buscar solo en el directorio
actual, usaría -maxdepth 1
.
Suponga que tiene la siguiente
estructura de directorios:
directory ├── clients.txt ├── partners.txt -> clients.txt └── somedir ├── anotherdir └── clients.txt
Para buscar dentro de somedir
,
necesitaría usar -maxdepth 2
(el directorio actual +1 nivel hacia
abajo). Para buscar dentro de anotherdir
,
se necesitaría -maxdepth 3
(el directorio actual +2 niveles hacia
abajo). El parámetro -mindepth N
funciona de manera opuesta buscando solo
en directorios al menos N
niveles hacia abajo.
El parámetro -mount
puede
usarse para evitar que find
caiga dentro de los sistemas de archivos
montados. También puede restringir la
búsqueda a tipos específicos de sistemas
de archivos usando el parámetro -fstype
.
Así que find /mnt -fstype exfat
-iname "\ report"
solo buscaría dentro de los sistemas de
archivos exFAT montados en /mnt
.
Búsqueda por atributos
Puede utilizar los siguientes parámetros para buscar archivos con atributos específicos, como los que su usuario puede escribir, tienen un conjunto específico de permisos o tienen un tamaño determinado:
-user USERNAME
-
Coincide con los archivos propiedad del usuario
USERNAME
. -group GROUPNAME
-
Coincide con archivos propiedad del grupo
GROUPNAME
. -readable
-
Coincide con archivos que son legibles por el usuario actual.
-writable
-
Coincide con archivos en los que el usuario actual puede escribir.
-executable
-
Busca archivos que son ejecutables por el usuario actual. En el caso de directorios, esto coincidirá con cualquier directorio que el usuario pueda ingresar (permiso
x
). -perm NNNN
-
Esto coincidirá con cualquier archivo que tenga exactamente el permiso
NNNN
. Por ejemplo,-perm 0664
coincidirá con cualquier archivo que el usuario y el grupo puedan leer y escribir y que otros puedan leer (orw-rw-r--
).
Puede agregar un -
antes de NNNN
para
buscar archivos que tengan al
menos el permiso especificado.
Por ejemplo, -perm -644
coincidiría con archivos que tengan al
menos permisos 644
(rw-r—
r--
). Esto incluye un
archivo con 664
(rw-rw-r--
)
o incluso 775
(rwxrwx-r-x
).
-empty
-
Coincidirá con archivos y directorios vacíos.
-size N
-
Coincidirá con cualquier archivo de tamaño
N
, dondeN
por defecto es un número de bloques de 512 bytes. Puede agregar sufijos aN
para otras unidades:Nc
contará el tamaño en bytes,Nk
en kibibytes (KiB, múltiplos de 1024 bytes),NM
en mebibytes (MiB, múltiplos de 1024 * 1024) yNG
para gibibytes (GiB, múltiplos de 1024 * 1024 * 1024).
Nuevamente, puede agregar los
prefijos +
o -
(aquí significa más grande que
ó más pequeño que) para
buscar tamaños relativos. Por ejemplo,
-size -10M
coincidirá con
cualquier archivo de menos de 10 MiB
de tamaño.
Por ejemplo, para buscar archivos en
su directorio de inicio que contengan
el patrón report
sin
distinguir entre mayúsculas y
minúsculas en cualquier parte del
nombre, tengan permisos 0644
,
hayan sido accedidos hace 10 días y
cuyo tamaño sea de al menos 1 Mib,
podría utilizar
$ find ~ -iname "*report*" -perm 0644 -atime 10 -size +1M
Búsqueda por tiempo
Además de buscar atributos, también puede realizar búsquedas por tiempo, encontrando archivos a los que se accedió, se les cambiaron los atributos o se modificaron durante un período de tiempo específico. Los parámetros son:
-amin N
,-cmin N
,-mmin N
-
Esto coincidirá con los archivos a los que se ha accedido, se han cambiado los atributos o se han modificado (respectivamente)
N
minutos atrás. -atime N
,-ctime N
,-mtime N
-
Esto coincidirá con los archivos a los que se accedió, se cambiaron los atributos o se modificaron
N*24
horas atrás.
Para -cmin N
y -ctime
N
, cualquier cambio de
atributo provocará una coincidencia,
incluido un cambio en los permisos,
lectura o escritura en el archivo.
Esto hace que estos parámetros sean
especialmente poderosos, ya que
prácticamente cualquier operación que
involucre el archivo activará una
coincidencia.
El siguiente ejemplo coincidiría con cualquier archivo del directorio actual que se haya modificado hace menos de 24 horas y tenga un tamaño superior a 100 MiB:
$ find . -mtime -1 -size +100M
Usando
locate
y updatedb
locate
y updatedb
son comandos que pueden usarse para
encontrar rápidamente un archivo que
coincida con un patrón dado en un
sistema Linux. Pero a diferencia de find
,
locate
no buscará el
patrón en el sistema de archivos: en
su lugar, lo buscará en una base de
datos construida ejecutando el comando
updatedb
. Esto le da
resultados muy rápidos, pero pueden
ser imprecisos dependiendo de cuándo
se actualizó la base de datos por
última vez.
La forma más sencilla de usar locate
es simplemente darle un patrón para
buscar. Por ejemplo, para encontrar
todas las imágenes JPEG en su sistema,
usaría locate jpg
. La
lista de resultados puede ser bastante
extensa, pero debería verse así:
$ locate jpg /home/carol/Downloads/Expert.jpg /home/carol/Downloads/Hotbit.jpg /home/carol/Downloads/Mate1.jpg /home/carol/Downloads/Mate2.jpg /home/carol/Downloads/Mate3.jpg /home/carol/Downloads/Pentaro.jpg /home/carol/Downloads/Sala.jpg /home/carol/Downloads/pixel_3a_seethrough_1.jpg /home/carol/Downloads/jpg_specs.doc
Cuando se le solicite el patrón jpg
,
locate
mostrará todo lo
que contenga este patrón, sin importar
lo que venga antes o después. Puede
ver un ejemplo de esto en el archivo jpg_specs.doc
en la lista de arriba: contiene el
patrón, pero la extensión no es jpg
.
Tip
|
Recuerde que con |
Por defecto, el patrón distingue
entre mayúsculas y minúsculas. Esto
significa que los archivos que
contienen .JPG
no se
mostrarán ya que el patrón está en
minúsculas. Para evitar esto, pase el
parámetro -i
a locate
.
Repitiendo nuestro ejemplo anterior:
$ locate -i .jpg /home/carol/Downloads/Expert.jpg /home/carol/Downloads/Hotbit.jpg /home/carol/Downloads/Mate1.jpg /home/carol/Downloads/Mate1_old.JPG /home/carol/Downloads/Mate2.jpg /home/carol/Downloads/Mate3.jpg /home/carol/Downloads/Pentaro.jpg /home/carol/Downloads/Sala.jpg /home/carol/Downloads/pixel_3a_seethrough_1.jpg
Observe que el archivo Mate1_old.JPG
,
en negritas arriba, no estaba presente
en la lista anterior.
Puede pasar varios patrones para locate
,
simplemente sepárelos con espacios. El
siguiente ejemplo haría una búsqueda
que no distingue entre mayúsculas y
minúsculas para cualquier archivo que
coincida con los patrones zip
y jpg
:
$ locate -i zip jpg /home/carol/Downloads/Expert.jpg /home/carol/Downloads/Hotbit.jpg /home/carol/Downloads/Mate1.jpg /home/carol/Downloads/Mate1_old.JPG /home/carol/Downloads/Mate2.jpg /home/carol/Downloads/Mate3.jpg /home/carol/Downloads/OPENMSXPIHAT.zip /home/carol/Downloads/Pentaro.jpg /home/carol/Downloads/Sala.jpg /home/carol/Downloads/gbs-control-master.zip /home/carol/Downloads/lineage-16.0-20190711-MOD-quark.zip /home/carol/Downloads/pixel_3a_seethrough_1.jpg /home/carol/Downloads/jpg_specs.doc
Cuando utilice varios patrones, puede
solicitar la ubicación para mostrar
solo los archivos que coincidan con todos.
Esto se hace con la opción -A
.
El siguiente ejemplo mostraría
cualquier archivo que coincida con los
patrones .jpg
y
los patrones .zip
:
$ locate -A .jpg .zip /home/carol/Downloads/Pentaro.jpg.zip
Si desea contar el número de archivos
que coinciden con un patrón dado en
lugar de mostrar su ruta completa,
puede usar la opción -c
.
Por ejemplo, para contar el número de
archivos .jpg
en un
sistema:
$ locate -c .jpg 1174
Un problema con locate
es que solo muestra las entradas
presentes en la base de datos generada
por updatedb
(ubicada en
/var/lib/mlocate.db
). Si
la base de datos está desactualizada,
la salida podría mostrar archivos que
se han eliminado desde la última vez
que se actualizó. Una forma de evitar
esto es agregar el parámetro -e
,
que hará que verifique si el archivo
todavía existe antes de mostrarlo en
la salida.
Por supuesto, esto no resolverá el
problema de los archivos creados después
de que la última actualización de la
base de datos no aparezca. Para ello
tendrá que actualizar la base de datos
con el comando updatedb
.
El tiempo que llevará esto dependerá
de la cantidad de archivos de su
disco.
Controlar
el comportamiento de updatedb
El comportamiento de updatedb
puede ser controlado por el archivo
/etc/updatedb.conf
.
Este es un archivo de texto donde
cada línea controla una variable.
Las líneas en blanco se ignoran y
las líneas que comienzan con el
caracter #
se tratan
como comentarios.
PRUNEFS=
-
Cualquier tipo de sistema de archivos indicado después de este parámetro no será escaneado por
updatedb
. La lista de tipos debe estar separada por espacios y los tipos en sí no distinguen entre mayúsculas y minúsculas, por lo queNFS
ynfs
son lo mismo. PRUNENAMES=
-
Esta es una lista de nombres de directorios separados por espacios que no deberían ser escaneados por
updatedb
. PRUNEPATHS=
-
Esta es una lista de nombres de ruta que deben ser ignorados por
updatedb
. Los nombres de las rutas deben estar separados por espacios y especificados de la misma manera que se mostrarían conupdatedb
(por ejemplo,/var/spool/media
) PRUNE_BIND_MOUNTS=
-
Esta es una variable simple
sí
ono
. Si se establece enyes
, los montajes de enlace (los directorios montados en otro lugar con el comandomount --bind
) serán ignorados.
Búsqueda de binarios, páginas del manual y código fuente
which
es un comando muy
útil que muestra la ruta completa a un
ejecutable. Por ejemplo, si desea
ubicar el ejecutable de bash
,
puede usar:
$ which bash /usr/bin/bash
Si se agrega la opción -a
,
el comando mostrará todos los nombres
de ruta que coincidan con el
ejecutable. Observa la diferencia:
$ which mkfs.ext3 /usr/sbin/mkfs.ext3 $ which -a mkfs.ext3 /usr/sbin/mkfs.ext3 /sbin/mkfs.ext3
Tip
|
Para encontrar qué
directorios están en el |
type
es un comando
similar que mostrará información sobre
un binario, incluyendo dónde se
encuentra y su tipo. Simplemente use type
seguido del nombre del comando:
$ type locate locate is /usr/bin/locate
El parámetro -a
funciona de la misma manera que en which
,
mostrando todos los nombres de ruta
que coinciden con el ejecutable. Al
igual que:
$ type -a locate locate is /usr/bin/locate locate is /bin/locate
Y el parámetro -t
mostrará el tipo de archivo del
comando, que puede ser alias
,
keyword
, function
,
builtin
o file
.
Por ejemplo:
$ type -t locate file $ type -t ll alias $ type -t type type is a built-in shell command
El comando whereis
es
más versátil y, además de los
binarios, también se puede usar para
mostrar la ubicación de las páginas de
manual o incluso el código fuente de
un programa (si está disponible en su
sistema). Simplemente escriba whereis
seguido del nombre binario:
$ whereis locate locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
Los resultados anteriores incluyen
binarios (/usr/bin/locate
)
y páginas de manual comprimidas (/usr/share/man/man1/locate.1.gz
).
Puede filtrar rápidamente los
resultados utilizando modificadores de
línea de comandos como -b
,
que los limitará solo a los binarios,
-m
, que los limitará solo
a páginas de manual, o -s
,
que los limitará solo al código
fuente. Repitiendo el ejemplo
anterior, obtendría:
$ whereis -b locate locate: /usr/bin/locate $ whereis -m locate locate: /usr/share/man/man1/locate.1.gz
Ejercicios Guiados
-
Usando
find
, busque solo en el directorio actual los archivos que el usuario pueda escribir, que hayan sido modificados en los últimos 10 días y tengan más de 4 GiB.
-
Usando
locate
, busque cualquier archivo que contenga tanto los patronesreport
comoupdated
,update
oupdating
en sus nombres.
-
¿Cómo puede encontrar dónde se almacena la página de manual de
ifconfig
?
-
¿Qué variable debe agregarse a
/etc/updatedb.conf
para queupdatedb
ignore los sistemas de archivosntfs
?
-
Un administrador del sistema desea montar un disco interno (
/dev/sdc1
). Según la FHS, ¿en qué directorio se debe montar este disco?
Ejercicios Exploratorios
-
Cuando se usa
locate
, los resultados se extraen de una base de datos generada porupdatedb
. Sin embargo, esta base de datos puede estar desactualizada, lo que hace quelocate
muestre archivos que ya no existen. ¿Cómo se puede hacer quelocate
muestre solo los archivos existentes en su salida?
-
Busque cualquier archivo en el directorio o subdirectorios actuales hasta 2 niveles hacia abajo, excluyendo los sistemas de archivos montados, que contengan el patrón
Status
ostatute
en sus nombres.
-
Limitando la búsqueda a los sistemas de archivos
ext4
, busque cualquier archivo en/mnt
que tenga al menos permisos de ejecución para el grupo, sea legible para el usuario actual y haya cambiado algún atributo en las últimas 2 horas.
-
Busque archivos vacíos creados hace más de 30 días y que estén al menos dos niveles por debajo del directorio actual
-
Considere que los usuarios
carol
yjohn
son parte del grupomkt
. Busque en el directorio de inicio dejohn
cualquier archivo que también sea legible porcarol
.
Resumen
En esta lección, aprendió acerca de la organización básica del sistema de archivos en una máquina Linux, según el FHS, y cómo buscar binarios y archivos, ya sea por nombre o por atributos. Los siguientes comandos se discutieron en esta lección:
find
-
Un comando versátil que se utiliza para buscar archivos y carpetas según una variedad de criterios de búsqueda.
locate
-
Una utilidad que utiliza una base de datos local que contiene las ubicaciones de los archivos almacenados localmente.
Updatedb
-
Actualiza la base de datos local utilizada por el comando
locate
. which
-
Muestra la ruta completa a un ejecutable.
whereis
-
Muestra las ubicaciones de las páginas del manual, los binarios y el código fuente en el sistema.
type
-
Muestra la ubicación de un binario y el tipo de aplicación que es (como un programa que está instalado, un programa Bash integrado y más).
Respuestas a los ejercicios guiados
-
Usando
find
, busque solo en el directorio actual los archivos que el usuario pueda escribir, que hayan sido modificados en los últimos 10 días y tengan más de 4 GiB.Para ello, necesitará los parámetros
-writable
,-mtime
y-size
:find . -writable -mtime -10 -size 4G
-
Usando
locate
, busque cualquier archivo que contenga tanto los patronesreport
comoupdated
,update
oupdating
en sus nombres.Dado que
locate
debe coincidir con todos los patrones, utilice la opción-A
:locate -A "report" "updat"
-
¿Cómo puede encontrar dónde se almacena la página de manual de
ifconfig
?Utilice el parámetro
-m
parawhereis
:whereis -m ifconfig
-
¿Qué variable debe agregarse a
/etc/updatedb.conf
para queupdatedb
ignore los sistemas de archivosntfs
?La variable es
PRUNEFS=
seguida del tipo de sistema de archivos:PRUNEFS=ntfs
-
Un administrador del sistema desea montar un disco interno (
/dev/sdc1
). Según la FHS, ¿en qué directorio se debe montar este disco?En la práctica, el disco se puede montar en cualquier lugar. Sin embargo, la FHS recomienda que los montajes temporales se realicen en
/mnt
Respuestas a ejercicios exploratorios
-
Cuando se usa
locate
, los resultados se extraen de una base de datos generada porupdatedb
. Sin embargo, esta base de datos puede estar desactualizada, lo que hace quelocate
muestre archivos que ya no existen. ¿Cómo se puede hacer quelocate
muestre solo los archivos existentes en su salida?Agregue el parámetro
-e
, como enlocate -e PATTERN
. -
Busque cualquier archivo en el directorio o subdirectorios actuales hasta 2 niveles hacia abajo, excluyendo los sistemas de archivos montados, que contengan el patrón
Status
ostatute
en sus nombres.Recuerde que para
-maxdepth
también debe considerar el directorio actual, por lo que queremos tres niveles (el actual más 2 niveles hacia abajo):find . -maxdepth 3 -mount -iname "*statu*"
-
Limitando la búsqueda a los sistemas de archivos
ext4
, busque cualquier archivo en/mnt
que tenga al menos permisos de ejecución para el grupo, sea legible para el usuario actual y haya cambiado algún atributo en las últimas 2 horas.Utilice el parámetro
-fstype
demount
para limitar la búsqueda a tipos específicos de sistemas de archivos. Un archivo legible por el usuario actual tendría al menos4
en el primer dígito de los permisos, y un ejecutable del grupo tendría al menos1
en el segundo dígito. Como no nos importan los permisos de los demás, podemos usar0
para el tercer dígito. Use-cmin N
para filtrar los cambios de atributos recientes, recordando que N se especifica en minutos. Entonces:find /mnt -fstype ext4 -perm -410 -ctime 120
-
Busque archivos vacíos creados hace más de 30 días y que estén al menos dos niveles por debajo del directorio actual
El parámetro
-mindepth N
se puede utilizar para limitar la búsqueda al menos aN
niveles hacia abajo, pero recuerde que debe incluir el directorio actual en la cantidad de niveles. Use-empty
para verificar archivos vacíos y-mtime N
para verificar la hora de modificación. Entonces:find . -empty -mtime +30 -mindepth 3
-
Considere que los usuarios
carol
yjohn
son parte del grupomkt
. Busque en el directorio de inicio dejohn
cualquier archivo que también sea legible porcarol
.Teniendo en cuenta que son miembros del mismo grupo, necesitamos al menos una
r
(4
) en los permisos del grupo, y no nos importan los demás. Entonces:find /home/john -perm -040