Esta página puede ser redistribuida libremente bajo los términos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducción española no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicación original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000). |
![]() |
Esta ausencia de garantía se hace extensa a cualquier tipo de uso de este material y muy especialmente a las prácticas, ejercicios, y de ejemplos que encuentre en estas páginas. Deberá trabajar siempre salvo indicación contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurará usar el directorio '/tmp' o algún otro que no contenga información valiosa. Tampoco se considera buena idea practicar en una máquina que contenga información valiosa. Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad será únicamente suya. En ningún caso podrá reclamar a nadie por daños y perjuicios derivados del uso de este material. Para más información lea el contenido de la licencia GPL y abstengase de hacer prácticas si no está dispuesto a asumir toda la responsabilidad.
|
Introducción
A menudo la palabra fichero se puede usar de dos formas. Ficheros en
sentido amplio como cualquier cosa que tiene nombre en un sistema de
ficheros y otra como ficheros propiamente dichos que más tarde llamaremos
ficheros regulares. Estos últimos son la clase de ficheros más normalitos
y sirven para contener información legible o ejecutable.
Se trata de una coincidencia de nombres especialmente lamentable porque
dificulta mi trabajo de explicar ahora las cosas.
Por ejemplo cuando
hablamos de generalidades para los nombres de ficheros y cuando hablemos
de tipos de ficheros estaremos hablando de ficheros en sentido amplio,
en cambio cuando hablamos de dirigir la salida a un fichero o cuando
decimos que leemos un fichero nos referimos a ficheros propiamente
dichos es decir ficheros regulares que son los que se usan normalmente
como contenedores de información.
Las palabras no siempre significan lo mismo usadas en diferentes
contextos así que nosotros confiaremos en su capacidad de deducción
y usaremos indistintamente la palabra fichero para ambas cosas aunque
reconocemos que es una costumbre que no facilita las cosas, pero
por desgracia verá este término utilizado en diferentes sitios usado
para ambas cosas.
No se preocupe y tenga paciencia al fin y al cabo si ya ha llegado
hasta aquí, su sagacidad a quedado prácticamente demostrada.
Comprenderá todo esto cuando hablemos de tipos de ficheros.
Para poner a prueba una vez más su sagacidad,
(santa paciencia la suya) usaremos el término ficheros en sus dos
acepciones para describir una clase de ficheros llamada directorios.
Los directorios
pueden considerarse como una clase de ficheros que pueden contener toda
clase de 'ficheros' (en sentido general) incluidos nuevos
directorios, lo cual hace que la estructura final tenga estructura
similar a la de un arbol.
Las ramas de un arbol forman la estructura de todo el arbol y de forma
muy similar los directorios forman el armazón de toda la estructura
del sistema de ficheros.
Un sistema de ficheros en Unix tiene esta estructura de árbol y el punto de
origen se llama root (raíz) y se caracteriza porque el padre de 'root'
resulta ser el mismo 'root' y se simboliza por '/'.
Ya sabemos que esto es raro pero no pregunte como alguien
puede ser padre de si mismo. Esto sencillamente es un truco para rematar
la estructura de todo el árbol de alguna forma.
Ojo el super usuario también se le llama 'root' pero no tiene nada que ver
con esto. Es solo otra molesta coincidencia.
Nombres de ficheros
Cuando un usuario es dado de alta se define la shell por defecto que usará
y el directorio de entrada. Este directorio de entrada al sistema será el
valor de la variable $HOME.
En cada directorio hay dos entradas como mínimo que son '.' y '..' que
referencian respectivamente al directorio actual y al directorio
padre. (Cuando no tenemos en la variable $PATH referenciado el subdirectorio
actual tendremos que ejecutar los comandos de nuestro directorio actual
mediante ./comando)
El carácter '/' se utiliza para separar los diferentes componentes de un
nombre de fichero y por eso no se puede usar como pare de un nombre
de fichero. El carter nulo se usa como fin de cadena en en lenguaje C
que es el lenguaje en el que está escrito el SO. Por eso tampoco se
puede usar ese caracter como nombre de fichero.
Cuando usamos un nombre de fichero que empieza por '/' se llama nombre de
camino completo o nombre de camino absoluto. Si por el contrario empieza por
'.', por '..', o por un nombre se denominará nombre de camino relativo,
porque su utilización depende del subdirectorio actual donde nos encontremos.
La última parte del nombre después del último carácter '/' se llama nombre
base. basename(1).
Los ficheros que empiezan por '.' no tienen realmente nada de especial.
Ya explicamos que la shell no expande los nombres de estos ficheros y
algunos comandos como 'ls' y otros los consideran de una forma especial.
Por ejemplo al usar el comando 'ls' sin parámetros no muestra esos ficheros.
Por todo ello aparentan ser invisibles cuando en realidad son algunos
comandos como 'ls' y el propio 'bash' quienes los tratan de forma especial.
Muchos ficheros que son de uso particular de algunos programas se usan
de esta forma para que el usuario pueda ignorarlos en condiciones
normales.
En 'msdos' existe un concepto llamado extensión. Corresponde con un
máximo de tres caracteres después del último punto en un nombre de
fichero. En Unix los nombres pueden tener varios puntos y después del
último punto puede haber más de tres caracteres alfanuméricos ya que
no existe el concepto de extensión. De existir nombres que terminan
de una cierta forma puede tener significado especial para algunos
programas pero no para núcleo (kernel) y tampoco para el interprete de
comandos.
Lo que si tiene un tratamiento especial a nivel de sistema operativo
son los caracteres '/' que forzosamente indican los elemento de un
camino formado por la sucesión de caracteres. Es decir será imposible
crear un fichero con nombre 'x/a' dentro de un directorio porque
el sistema interpretaría que queremos crear un fichero 'a' dentro de
un directorio 'x'.
Comandos para manejar el sistema de ficheros
Recuerde que tiene a sus disposición el comando 'man' para consultar las
distintas opciones de cada uno de estos comandos.
Alias para el uso de los comandos más frecuentes
En muchos sistemas parecerá
que existe la disponibilidad de usar un comando 'll' que sirve para
mostrar un directorio con abundante información. En realidad se trata
de un alias. Usted puede verificar los alias definidos para su usuario
tecleando 'alias' sin argumentos. Generalmente se usa para abreviar el
uso de comandos muy utilizados. Esto puede resultarle de interés para
personalizar su entorno.
Cuando el interprete de comandos arranca
se ejecutan una serie de ficheros '/etc/profile', '~/.bash_profile',
'~/.bash_login', y '~/.profile' en este orden. En '.bash_profile' suele
existir una parte que pregunta por la existencia de un '~/.alias' y en
caso afirmativo lo ejecuta. Este fichero '.alias' contiene una serie de
comandos de alias que permanecerán disponibles durante su sesión de
trabajo con esa shell.
Podría parecer que estamos obsesionados con la
shell y que no sabemos hablar de otra cosa pero solo queremos
proporcionarle ahora unos consejos prácticos que le faciliten el uso
de su sistema. Para ello tendría que editar el fichero '.alias' presente
en su $HOME y añadir las líneas siguientes:
Puede ejecutar el fichero '.alias' para definir todos estos alias
O puede ejecutar cualquiera de estos comandos alias ahora mismo, por ejemplo
Luego teclee el comando 'alias'. Comprobará que queda definido.
Teclee el nuevo comando 'll' y compruebe su efecto.
El bash solo expande los alias de la primera palabra de un comando y
solo cuando no van entrecomillados. Por eso cuando definimos un alias
que sustituye a un comando (Por ejemplo "ls='ls --color=auto'")
tendremos que usar 'ls' entre comillas simples o dobles para si no
deseamos que se produzca la expansión del alias.
Para eliminar una definición de alias utilice el comando 'unalias'
En nuestro caso.
Para no tener que teclear manualmente cada vez cada uno de estos
alias es para lo que sirve el fichero '.alias'.
Si no sabe editarlo tendrá que esperar a que expliquemos el manejo
del editor 'vi' y volver a esta sección para modificar su fichero
'.alias'. Los alias serán definidos la próxima vez que entre en una
nueva sesión. Explicaremos las ventajas de usar algunos de los alias
que acabamos de proponerle.
ll Los ficheros más interesantes son generalmente los más recientes
y para evitar que desaparezcan durante un scroll largo los mostraremos en
último lugar. La opción de color auto colorea la salida del comando
únicamente si la salida ocurre en el terminal.
ll. Sirve para listar ficheros que empiezan por un punto y
después tienen una letra o dígito como segundo carácter. Normalmente
los ficheros de configuración de su usuario se encuentran en su $HOME
y utilizan nombres de este tipo que no aparecen en la expansión de
un '*'.
rm Este alias evita usar 'rm' tal cual está añadiéndole la
opcíon -i para confirmar antes de borrar. Realmente útil. Es muy
recomendable usar 'rm' por defecto de esta forma. Si no desea ser
interrogado a cada fichero si realmente desea borrarlo o no,
utilice este alias tal como está pero añadiendo la opción -f.
rm -f <lista-de-ficheros> borrará silenciosamente todo lo que usted
ordene que no tiene que coincidir con todo lo que usted supone que
ha ordenado. En especial si no pone cuidado al usar la expansión de
ordenes de la shell.
La respuesta a la pregunta de como recuperar
un fichero borrado accidentalmente es... 'De ninguna forma'.
Cosas simpáticas de Unix y Linux.
Puede que sepa de alguien que en cierta ocasión recuperó una información
valiosa usando trucos o herramientas especiales pero no cuente con ello.
Hay programas de borrado que usan papeleras y quizás piense en poner
un alias de rm para que use uno de estos programas. Esto introduce
ineficiencia en el sistema pero puede hacerse a nivel de usuario.
Lo más correcto es usar una buena política de copias de seguridad.
mv Se trata de mover información pero aplicamos el mismo
principio que para 'rm'.
Ejemplos de uso de los comandos estudiados
Para borrar todo esto se suele usar la opción de borrado recursivo.
No debe usar esta opción como root sin estar muy seguro de lo que hace.
Esta opción borra recursivamente y es muy peligrosa porque un error
puede borrar recursivamente desde un lugar equivocado un montón de
información.
No es necesario borrar nada porque en /tmp la información
suele borrarse durante el arranque. Si quiere intentarlo con las
precauciones mencionadas teclee 'rm -fr /tmp/kkkk'. Si lo prefiere
puede dejarlo sin borar ya que no ocupa casi nada y se borrará la
proxima vez que se vacíe el '/tmp' que será seguramente cuando vuelva a
arrancar el ordenador.
Para que los comandos anteriores puedan funcionar correctamente deberemos
tener los permisos adecuados sobre los ficheros y los subdirectorios.
Evidentemente hay muchos más y no podemos explicarlos todos ahora pero
quizás sea bueno mostrar una pequeña lista de algunos de ellos que
veremos más adelante en posteriores capítulos.
Sistema plano de ficheros
A cada ficheros se le asocia un número para poder localizarlo directamente.
Dicho número se llama inodo. Los números de inodos son el índice del
sistema plano de ficheros, también llamado por ello tabla de inodos
Cada fichero de cada sistema de ficheros tiene
un inodo distinto salvo que se trate de un enlace rígido (hard link). Sin
embargo hay inodos que no se corresponden con ningún fichero.
Un fichero en sentido estricto indica
capacidad de contener una secuencia de bytes.
Un inodo indica básicamente
la capacidad de tener un nombre asociado al sistema de ficheros.
Un fichero tiene asociadas funciones de posición y de lectura y escritura
de información dentro del fichero. Un inodo es una referencia muy directa
a un fichero y a grandes rasgos tiene asociadas funciones que permiten
manejar y construir la estructura de árbol del sistema de ficheros.
Tipos de ficheros
Generalmente los diferentes tipos de ficheros son capaces de aceptar
operaciones de apertura, cierre, lectura y escritura de forma similar.
Por ello se puede redirigir una entrada y una salida a diferentes
tipos de ficheros. Parte de la enorme potencia y flexibilidad de los
SO tipo Unix residen en este hecho. Gracias a esto la combinación de
entradas salidas entre procesos, ficheros, dispositivos, etc.. resulta
muy sencilla y flexible. Existe una salvedad importante. Los directorios
en este sentido son totalmente especiales y un intendo de escribir en un
directorio dará siempre un error aunque sea realizado por 'root'.
No tiene sentido permitirlo. Los directorios se crean, borran,
y modifican con comandos específicos para ellos.
Atributos de fecha en ficheros
Una de ellas
indica el tiempo del último acceso realizado sobre ese fichero. La otra
indica la fecha de creación (en realidad es la fecha del último cambio
de estado) de ese fichero y la última y quizás más
importante (es la que vemos al consultar con 'ls -l') indica la fecha
de la última modificación.
En realidad si cambiamos el estado de un
fichero por ejemplo cambiando permisos o el propietario se modificarán
las fechas de creación y del último acceso. Por eso la fecha que hemos
denominado de creación puede ser posterior a la fecha de modificación
del fichero.
Cuando se crea un fichero las tres fechas tendrán el
mismo valor. Cuando se lee un fichero se modifica la fecha de acceso
del mismo pero acceder al nombre de un fichero o consultar el estado
de un fichero no modifica ninguna fecha. Su fecha de acceso tampoco
ya que en realidad lo que
se hace es leer la información del directorio que lo contiene el cual
si que verá modificada su fecha de acceso.
Las fechas de modificación
asociadas a los directorios cambian con las altas, o bajas de los
elementos dentro del directorio. Esto es debido a que dichas operaciones
se consideran como si fueran escrituras en el fichero especial de tipo
directorio. Un directorio es al fin y al cabo una simple tabla. Esto
lo recordaremos cuando hablemos de permisos asociados a directorios.
Para modificar las fechas de modificación y de acceso de un fichero se
puede usar el comando touch(1)
Test
Este es sin duda uno de los capítulos con mayor interés práctico.
Un nombre de fichero valido para el núcleo de Linux puede contener cualquier
carácter salvo el caracter '/' y salvo el carter '\0' (caracter nulo).
Sin embargo no es prudente usar caracteres especiales interpretados por la
shell ($,",',&,#,(,),*,[,],{,}, etc..) Tampoco debe empezar por el carácter '-' que
puede ser confundido con una opción. Por ejemplo si llamamos a un fichero
'-r' no solo no podremos borrarlo sino que se puede confundir con la
peligrosísima opción '-r' de borrado recursivo.
$ # Ejemplo de uso del comando basename
$ basename /usr/include/sys/signal.h
signal.h
Relación de comandos más importantes para manejar el sistema de
ficheros.
ls <lista> Muestra el contenido de directorio actual.
cd <dir> Cambiar a un subdirectorio.
mkdir <lista-dir> Crea uno o mas directorio.
rmdir <lista-dir> Borra uno mas directorios.
cp <lista> Copiar uno o mas ficheros al ultimo de la lista.
Si mas de dos el ultimo debe ser un directorio.
mv <lista> mover o renombrar ficheros o directorios al ultimo
nombre de la lista.
Si mas de dos el ultimo debe ser un directorio.
rm <lista> borrar la lista de ficheros.
ln Crear un enlace a un fichero
touch Crea un fichero vacío o modifica la fecha de un fichero
pwd muestra el camino absoluto del directorio actual.
chmod Cambia los permisos de un fichero.
chown Cambia el propietario de un fichero.
chgrp Cambia el grupo de un fichero.
du <fichero> Ocupación de un fichero
tree Listado recursivo
tree -d Mostrar árbol de directorios
file <fichero> Obtiene información sobre el tipo de Ficheros
El comando 'cd' es un comando interno que sirve para cambiar de directorio
actual. Existe otro comando interno llamado 'alias' que sirve para algo
que no tiene que ver con el sistema de ficheros y sin embargo lo
mencionaremos aquí por razones prácticas.
alias ll='ls -lrt --color=auto'
alias ll.='ls -adlrt --color=auto .[a-zA-Z0-9]*'
alias ls='ls --color=auto'
alias ls.='ls -adrt --color=auto .[a-zA-Z0-9]*'
alias md='mkdir'
alias mv='mv -i'
alias rd='rmdir'
alias rm='rm -i'
$ . .alias
$ alias ll='ls -lrt --color=auto'
$ unalias ll
Ejecutaremos paso a paso una serie de comandos y comprobaremos lo
que ocurre.
$ # Crearemos un alias para ls con algunas opciones
$ alias ll='ls -lrt --color=auto'
$ # Creamos en /tmp una serie de directorios anidados
$ cd /tmp
$ mkdir kkkk
$ cd kkkk
$ # Consultamos en que directorio estamos situados
$ pwd
/tmp/kkkk
$ # Continuamos creando ficheros y directorios
$ echo xx > kk1
$ echo xx > kk2
$ echo xx > kk3
$ mkdir kkkk
$ # Usamos el alias por primera vez para ver el contenido
$ # del directorio actual.
$ ll
total 4
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01 kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01 kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01 kk3
drwxr-xr-x 2 acastro acastro 1024 abr 16 20:01 kkkk
$ # Continuamos creando ficheros y directorios
$ cd kkkk
$ echo xx > kk1
$ echo xx > kk2
$ echo xx > kk3
$ mkdir kkkk
$ cd kkkk
$ echo xx > kk1
$ echo xx > kk2
$ echo xx > kk3
$ cd /tmp/kkkk
$ # El alias ll corresponde con el comando ls con una serie de
$ # opciones pero podemos añadir nuevas opciones. Por ejemplo
$ # podemos hacer un listado recursivo de toda la estructura de
$ # ficheros y directorios que cuelga del directorio actual.
$ # /tmp/kkk
$ ll -R .
total 4
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01 kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01 kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01 kk3
drwxr-xr-x 3 acastro acastro 1024 abr 16 20:03 kkkk
kkkk:
total 4
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03 kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03 kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03 kk3
drwxr-xr-x 2 acastro acastro 1024 abr 16 20:04 kkkk
kkkk/kkkk:
total 3
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04 kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04 kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04 kk3
$ # Con el comando tree y la opción -d podemos ver la estructura
$ # simplemente con los directorios y como están colocados.
$ tree -d
.
`-- kkkk
`-- kkkk
2 directories
$ # Para ver la estructura completa usamos el comando
$ # tree sin opciones. Vemos ahora tambien los ficheros.
$ tree
.
|-- kk1
|-- kk2
|-- kk3
`-- kkkk
|-- kk1
|-- kk2
|-- kk3
`-- kkkk
|-- kk1
|-- kk2
`-- kk3
2 directories, 9 files
$ # Con find podemos buscar usando muchos criterios. Por ejemplo
$ # por nombre.
$ find . -name 'kk*'
./kk1
./kk2
./kk3
./kkkk
./kkkk/kk1
./kkkk/kk2
./kkkk/kk3
./kkkk/kkkk
./kkkk/kkkk/kk1
./kkkk/kkkk/kk2
./kkkk/kkkk/kk3
$ # Podemos buscar por fecha de modificación comparanda con la
$ # fecha de otro fichero. Por ejemplo que ficheros son más
$ # recientes que './kkkk/kk2' ?
$ find . -newer ./kkkk/kk2
./kkkk
./kkkk/kk3
./kkkk/kkkk
./kkkk/kkkk/kk1
./kkkk/kkkk/kk2
./kkkk/kkkk/kk3
$ # Podemos comprobar la ocupación de los directorios
$ du .
4 ./kkkk/kkkk
8 ./kkkk
12 .
sum Obtiene un valor de checksum
cksum Obtiene un valor de checksum largo y por tanto más seguro
gzip Compresor de GNU
find Buscar ficheros
tar Empaqueta ficheros y directorios en un solo fichero.
cpio Empaqueta ficheros y directorios en un solo fichero.
La estructura en forma de árbol tiene el inconveniente de que se
requiere ir recorriendo el árbol para ir localizando cada uno de
los elementos. Por ello se hace necesario un sistema mucho más directo.
$ echo > .
bash: .: Es un directorio
En Unix y Linux los ficheros en sentido amplio tienen asociadas siempre
tres fechas. En realidad estas fechas están almacenadas internamentte
como el número
de segundos transcurridos desde el '1 de Enero de 1970'.
Puede comprobar sus conocimientos respondiendo el siguiente test.
Para ello seleccione las opciones que se ajusten a la verdad y luego
pulse el boton para ver el resultado de su test.
Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos