Este artículo lo inicia en los comandos básicos de Linux para manipular los archivos y los directorios. Aprenda a:
- Listar el contenido del directorio
- Copiar, mover o quitar archivos y directorios
- Manipular muchos archivos y directorios repetidamente
- Utilizar los patrones comodines para manejar los archivos
- Usar el
comandofind para ubicar y tomar acción con los archivos basados en el tipo, el tamaño o el tiempo - Comprimir y descomprimir los archivos utilizando
gzipybzip2 - Guardar los archivos utilizando
tar,cpioydd
Este artículo lo ayuda a preparase para el Objetivo 103.2 en el Tema 103 del examen 101 de Linux Professional Institute's Junior Level Administration (LPIC-1). El objetivo tiene un peso de 4.
Todos los archivos en los sistemas de Linux y UNIX® son accedido como parte de un gran sistema de archivos único estructurado en árbol que tiene la raíz en /. Puede agregar más ramas a este árbol montándolas y quitándolas desmontándolas. Montar y desmontar será tratado en el artículo sobre Montar y desmontar los sistemas de archivos (ver la series roadmap).
Listado de los ingresos al directorio
En este artículo, practicaremos los comandos utilizando los archivos creados en dicho artículo "Learn Linux 101: Text streams and filters." Si leyó el artículo, creó un directorio, lpi103-2, en su directorio raíz. Si no lo hizo, entonces puede utilizar otro directorio en su sistema para practicar los comandos de los que se habla en este artículo.
Los nombres de los archivos y de los directorios son absolutos, es decir, comienzan con una /, o son relativos al directorio de trabajo actual, es decir, no comienzan con una /. La vía absoluta de un archivo o directorio consiste en una / seguida de una serie de ceros o nombres de más directorios, cada uno seguido de otra / y luego un nombre final.
El nombre de un archivo o de un directorio dado que sea relativo al actual directorio de trabajo, simplemente concatena el nombre absoluto del directorio de trabajo, una /, y el nombre relativo. Por ejemplo, el directorio, lpi103-2, que creamos en el anterior artículo fue creado en mi directorio raíz, /home/ian, de manera que es completo, o absoluto, la vía es /home/ian/lpi103-2.
Usted puede mostrar el nombre del actual directorio de trabajo con el comando
pwd. También está generalmente disponible en la
variable del entorno PWD. El listado 1 muestra el uso del comando
pwd, y las tres formas diferentes de utilizar el
comando ls para listar los archivos en este
directorio.
Listado 1. Listado de los ingresos al directorio
[ian@echidna lpi103-2]$ pwd
/home/ian/lpi103-2
[ian@echidna lpi103-2]$ echo "$PWD"
/home/ian/lpi103-2
[ian@echidna lpi103-2]$ ls
sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab
[ian@echidna lpi103-2]$ ls "$PWD"
sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab
[ian@echidna lpi103-2]$ ls /home/ian/lpi103-2
sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab
|
Como puede ver, usted puede darle un nombre al directorio relativo o absoluto como un
parámetro del comando ls, y listará el
contenido de ese directorio.
En un dispositivo de almacenamiento, un archivo o directorio está contenido en un conjunto de
bloques. La información acerca de un archivo está contenida en un
inode que registra la información tal como el propietario, cuándo fue la última vez que
se accedió al archivo, qué longitud tiene, si se trata de un directorio o no, y quién puede leer
o grabar en él. El número del inode también es conocido como
el número de serie del archivo y es exclusivo dentro de un determinado
sistema de archivos. Podemos utilizar el -l (o
--format=long) la opción para mostrar algo de la información
almacenada en el inode.
Por omisión, el comando ls no lista los archivos
especiales, aquéllos cuyos nombres comienzan con un punto (.). Cada directorio
que no sea el raíz tiene por lo menos dos entradas especiales: el
directorio en sí mismo (.) y el directorio matriz (..). El directorio raíz
no tiene un directorio matriz.
El listado 2 usa las opciones -l y
-a para mostrar un listado de formato largo de
todos los archivos incluyendo la entradas de directorio . y .. .
Listado 2. Mostrar un listado de directorio largo
[ian@echidna lpi103-2]$ ls -al
total 52
drwxrwxr-x. 2 ian ian 4096 2009-08-11 21:21 .
drwx------. 35 ian ian 4096 2009-08-12 10:55 ..
-rw-rw-r--. 1 ian ian 8 2009-08-11 21:17 sedtab
-rw-rw-r--. 1 ian ian 24 2009-08-11 14:02 text1
-rw-rw-r--. 1 ian ian 25 2009-08-11 14:27 text2
-rw-rw-r--. 1 ian ian 63 2009-08-11 15:41 text3
-rw-rw-r--. 1 ian ian 26 2009-08-11 15:42 text4
-rw-rw-r--. 1 ian ian 24 2009-08-11 18:47 text5
-rw-rw-r--. 1 ian ian 98 2009-08-11 21:21 text6
-rw-rw-r--. 1 ian ian 15 2009-08-11 14:41 xaa
-rw-rw-r--. 1 ian ian 9 2009-08-11 14:41 xab
-rw-rw-r--. 1 ian ian 17 2009-08-11 14:41 yaa
-rw-rw-r--. 1 ian ian 8 2009-08-11 14:41 yab
|
En el Listado 2, la primera línea muestra la cantidad total de bloques de disco (52) utilizados por los archivos listados. El resto de las líneas le indican a usted las entradas del directorio.
- El primer campo (drwxrwxr-x o -rw-rw-r-- en este caso) nos indica si el archivo es un directorio (d) o un archivo u otros valores para algunos archivos especiales (tales como los archivos en el sistema de archivos dev /). Usted conocerá más detalles sobre los vínculos simbólicos en el artículo Crear y cambiar los vínculos fuertes y los simbólicos (ver series roadmap). El tipo es seguido de tres conjuntos de permisos (tales como rwx o r--) para el propietario,los miembros del grupo del propietario, y para todos. Los tres valores, respectivamente, indican si el usuario, el grupo o todos tiene permiso de lectura (r), grabación (w), o ejecución (x). Se cubrirán otros usos tales como setuid, en este artículo Administrar los permisos y la propiedad de los archivos (ver el series roadmap).
- El siguiente campo es un número que nos indica la cantidad de vínculos fuertes al archivo. Dijimos que el inode contiene la información acerca del archivo. La entrada al directorio de archivos contiene un vínculo fuerte (o puntero) al inode para el archivo, de manera que cada entrada listada debería tener por lo menos un vínculo fuerte. Las entradas al directorio tiene uno adicional para la entrada . y uno para cada entrada al subdirectorio. Entonces podemos ver del Listado 2 que el directorio "my home", representado por .., tiene unos pocos subdirectorios, ya que tiene 35 vínculos fuertes.
- Los siguientes dos campos son el propietario del archivo y el grupo principal del propietario. Algunos sistemas, tales como los sistemas Red Hat o Fedora, omiten proveer un grupo separado para cada usuario. En otros sistemas, todos los usuarios pueden estar en uno o quizás en unos pocos grupos.
- El siguiente campo contiene la longitud del archivo en bytes.
- El penúltimo campo contiene el sello de la hora de la última modificación.
- Y el campo final contiene el nombre del archivo o del directorio.
La opción -i del comando
ls
le mostrará los números de inode.
Usted verá nuevamente los inodes luego en este artículo y también en el
artículo Create and change hard and symbolic links (ver
la series roadmap).
También podrá especificar los parámetros múltiples para el comando
ls, donde cada nombre corresponde al nombre de un
archivo o directorio. Para los nombres de directorio, el comando ls
lista el contenido del directorio en lugar de la información acerca del mismo.
tEn nuestro ejemplo, supongamos que deseamos la información sobre
la entrada al directorio lpi103-2 según está listada en el directorio
matriz. El comando ls -l ../lpi103-2 nos daría
un listado como el anterior ejemplo. El Listado 3 muestra cómo agregar
la opción -dpara listar la información sobre
las entradas al directorio en lugar del contenido de los directorios, y también cómo listar
las entradas para los archivos o directorios múltiples.
Listado 3. Uso del ls -d
[ian@echidna lpi103-2]$ ls -ld ../lpi103-2 sedtab xaa
drwxrwxr-x. 2 ian ian 4096 2009-08-12 15:31 ../lpi103-2
-rw-rw-r--. 1 ian ian 8 2009-08-11 21:17 sedtab
-rw-rw-r--. 1 ian ian 15 2009-08-11 14:41 xaa
|
Observe que el tiempo de modificación para lpi103-2 es diferente del de la lista anterior. También, como en el listado anterior, es diferente de los tiempo de cualquiera de los archivos en el directorio. ¿Es esto lo que usted esperaría? Generalmente no. Sin embargo, durante el desarrollo de este artículo, creé algunos modelos extras y luego los eliminé, de manera que los sellos del tiempo del directorio reflejen ese hecho. Hablaremos más acerca de los tiempos de los archivos luego en Manejo de los archivos y directorios múltiples.
Por omisión, ls lista los archivos alfabéticamente. Existe
una cantidad de opciones para clasificar la salida. Por ejemplo,
ls -tla clasificará por momento de la modificación (de la más reciente
a la más antigua) mientras que ls -lS producirá un largo listado
por tamaño (de la más larga a la más pequeña). El agregado de
-r revertirá el orden de la clasificación. Por ejemplo,
utilice ls -lrt para producir un largo listado clasificado
de la más antigua a la más reciente. Consulte la página man para obtener otras formas en las que puede listar
los archivos y los directorios.
Copia, traslado y eliminación de los archivos
Ahora hemos aprendido algunas formas para crear archivos, pero supongamos que deseemos hacer copias de los archivos, renombrarlos, moverlos alrededor de la jerarquía del sistema de archivos, o incluso eliminarlos. Utilizamos tres comandos breves a estos fines.
-
cp - es utilizado para hacer una copia de uno o más archivos o directorios. Usted debe dar uno (o más nombres fuente y un nombre destino. Los nombres fuente o destino pueden incluir la especificación de vía. Si el destino es un directorio existente, entonces todas las fuentes son copiadas en el destino. Si el destino es un directorio que no existe, entonces la (única) fuente también deberá ser un directorio y una copia del directorio fuente y de su contenido será hecha con el nombre destino como el nuevo nombre. Si el destino es un archivo, entonces la (única) fuente deberá ser también un archivo y una copia del archivo fuente será hecha con el nombre destino como el nuevo nombre, reemplazando cualquier archivo existente con el mismo nombre. Observe que no existe ningún supuesto por omisión del destino que sea el directorio actual como en los sistemas operativos de DOS y Windows.
-
mv - es utilizado para mover o renombrar uno o más archivos o
directorios. En general, los nombres que usted pueda usar siguen las mismas normas
que para copiar con
cp; puede renombrar un único archivo o mover un grupo de archivos a un nuevo directorio. Dado que el nombre es sólo una entrada al directorio que se vincula a un inode, no debería ser una sorpresa que el número del inode no cambie salvo que el archivo sea movido a otro sistema de archivos, en cuyo caso moverlo se comporta más como una copia seguida de la eliminación del original. -
rm - es utilizado para eliminar uno o más archivos. Veremos cómo quitar los directorios en breve.
El listado 4 muestra el uso de cp y de
mv para realizar algunas copias de backup de nuestros
archivos de texto. También usamos ls -i para mostrar los inodes
de algunos de nuestros archivos.
- primero hacemos una copia de nuestro archivo text1 como text1.bkp.
- Luego decidimos crear un subdirectorio de backup usando el comando
mkdir - Hacemos una segunda copia de backup de text 1, esta vez en el directorio de backup, y mostramos que los tres archivos tienen diferentes inodes.
- Luego movemos nuestro text1.bkp al directorio de backup y después de eso lo renombramos para que sea más consistente con el segundo backup. Mientras que podríamos haber hecho esto con un único comando, usamos dos para ilustrarlo.
- Verificamos nuevamente los inodes y confirmamos que text1.bkp con el inode 934193 ya no es más nuestro directorio lpi103-2, sino que ese inode corresponde a text1.bkp.1 en el directorio de backup.
Listado 4. Copiar y mover archivos
[ian@echidna lpi103-2]$ cp text1 text1.bkp
[ian@echidna lpi103-2]$ mkdir backup
[ian@echidna lpi103-2]$ cp text1 backup/text1.bkp.2
[ian@echidna lpi103-2]$ ls -i text1 text1.bkp backup
933892 text1 934193 text1.bkp
backup:
934195 text1.bkp.2
[ian@echidna lpi103-2]$ mv text1.bkp backup
[ian@echidna lpi103-2]$ mv backup/text1.bkp backup/text1.bkp.1
[ian@echidna lpi103-2]$ ls -i text1 text1.bkp backup
ls: cannot access text1.bkp: No such file or directory
933892 text1
backup:
934193 text1.bkp.1 934195 text1.bkp.2
|
Normalmente, el comando cp copiará un archivo sobre una
copia existente, si el archivo existente fuera factible de ser grabado. Por otro lado,
mvmoverá o renombrará un archivo si el destino
existe. Hay varias opciones útiles para este comportamiento de
cp y mv.
-fo--force- harán que
cpintente eliminar un archivo destino existente aun si no fuera factible de ser grabado. -io--interactive- pedirá la confirmación antes de intentar reemplazar un archivo existente
-bo--backup- realizará un backup de cualquier archivo que fuera reemplazado.
Como es habitual, consulte la página man para obtener los detalles completos de éstas y de otras opciones para copiar y mover.
El listado 6 muestra la copia con backup y la eliminación del archivo.
Listado 5. Hacer copias de backup y eliminar archivos
[ian@echidna lpi103-2]$ cp text2 backup
[ian@echidna lpi103-2]$ cp --backup=t text2 backup
[ian@echidna lpi103-2]$ ls backup
text1.bkp.1 text1.bkp.2 text2 text2.~1~
[ian@echidna lpi103-2]$ rm backup/text2 backup/text2.~1~
[ian@echidna lpi103-2]$ ls backup
text1.bkp.1 text1.bkp.2
|
Observe que el comando rm también acepta
-i (interactive) y
-f (force options).Una vez que haya eliminado un archivo
usando rm, el sistema de archivos ya no tendrá acceso a él.
Algunos sistemas definen un valor por omisión para establecer un alias
alias rm='rm -i' para el usuario raíz a fin de ayudar
a prevenir la eliminación inadvertida de los archivos. Ésta también es una buena idea, para
los usuarios comunes si está nervioso pensando en que podría eliminar alguno accidentalmente.
Antes de dejar este tema, se deberá observar que el comando
cp crea, por omisión, una nueva marcación de tiempo
para el y los nuevos archivos. El propietario y el grupo también son definidos para el propietario
y el grupo del usuario que esté haciendo la copia. La opción -p
puede ser utilizada para preservar los atributos seleccionados. Observe que el usuario raíz
puede ser el único usuario que puede preservar la propiedad. Vea la página man para obtener
más detalles.
Ya hemos visto cómo crear un directorio con
mkdir. Ahora veremos más en
mkdir y presentaremos a
rmdir, su análogo para eliminar los directorios.
Supongamos que estamos en nuestro directorio lpi103-2 y que deseamos crear los
subdirectorios dir1 y dir2. mkdir, así como los
comandos que acabamos de revisar, manejará las solicitudes múltiples para la creación
de los directorios en un paso como se muestra en el Listado 6.
Listado 6. Crear múltiples directorios
[ian@echidna lpi103-2]$ mkdir dir1 dir2
|
Observe que no hay ninguna salida al finalizar con éxito, aunque podría
usar echo $? para confirmar que el código de salida es
realmente 0.
Si en lugar de eso, deseara crear un subdirectorio anidado, tal como d1/d2/d3,
fallaría porque los directorios d1 y d2 no existen.
Afortunadamente, mkdir tiene una opción
-p que le permite crear cualquier directorio matriz
requerido, como se muestra en el Listado 7.
Listado 7. Creación de los directorios matrices
[ian@echidna lpi103-2]$ mkdir d1/d2/d3
mkdir: cannot create directory `d1/d2/d3': No such file or directory
[ian@echidna lpi103-2]$ echo $?
1
[ian@echidna lpi103-2]$ mkdir -p d1/d2/d3
[ian@echidna lpi103-2]$ echo $?
0
|
Eliminar los directorios usando el comando rmdir es lo opuesto
a crearlos. Nuevamente, existe una opción
-p para eliminar los matrices también. Usted puede
eliminar un directorio con rmdir sólo si está vacío
y no hay ninguna opción para forzar la eliminación. Veremos otra forma de lograr
ese truco cuando veamos el
manejo repetitivo. Una vez que aprenda esto, tal vez raramente
utilice rmdir en la línea de comandos,
pero aún así es bueno conocerlo.
A fin de ilustrar la eliminación del directorio, copiamos nuestro archivo text1 al
directorio d1/d2 de manera que ya no esté vacío. Luego usamos
rmdir para eliminar todos los directorios que acabamos de
crear con mkdir. Como puede ver, d1 y d2
no fueron eliminados porque d2 no estaba vacío. Los otros directorios fueron
eliminados. Una vez que eliminemos la copia de text1 de d2, podremos eliminar d1 y d2
con una única invocación de rmdir -p.
Listado 8. Eliminación de los directorios
[ian@echidna lpi103-2]$ cp text1 d1/d2
[ian@echidna lpi103-2]$ rmdir -p d1/d2/d3 dir1 dir2
rmdir: failed to remove directory `d1/d2': Directory not empty
[ian@echidna lpi103-2]$ ls . d1/d2
.:
backup sedtab text2 text4 text6 xab yab
d1 text1 text3 text5 xaa yaa
d1/d2:
text1
[ian@echidna lpi103-2]$ rm d1/d2/text1
[ian@echidna lpi103-2]$ rmdir -p d1/d2
|
Manejo de múltiples archivos y directorios
Hasta ahora los comandos que hemos utilizado han operado en un único archivo o tal vez en unos pocos archivos nombrados individualmente. En el resto de este artículo, veremos varias operaciones para manejar múltiples archivos, repetitivamente, manejando parte de un árbol de directorio, y guardando o restaurando múltiples archivos o directorios.
El comando ls tiene una opción
-R (observe la "R" en mayúsculas) para listar un
directorio y todos sus subdirectorios. La opción repetitiva se aplica sólo
a los nombres de los directorios; no encontrará todos los archivos denominados 'text1', por
ejemplo, en un árbol de directorios. Usted puede usar otras opciones que ya hayamos visto
junto con -R. Se muestra un listado repetitivo de
nuestro directorio lpi103-2, incluyendo los números de inode, ene l Listado 9.
Listado 9. Mostrar repetidamente los listados de los directorios
[ian@echidna lpi103-2]$ ls -iR
.:
934194 backup 933892 text1 933898 text3 933900 text5 933894 xaa 933896 yaa
933901 sedtab 933893 text2 933899 text4 933902 text6 933895 xab 933897 yab
./backup:
934193 text1.bkp.1 934195 text1.bkp.2
|
Puede utilizar -r (o
-R o la opción --repetitiva)
para hacer que el comando cp descienda a los
directorios fuente y que copie los contenidos repetitivamente. A fin de evitar una
repetición infinita, el directorio fuente no podrá ser copiado a sí mismo. El listado
10 muestra cómo copiar todo en nuestro directorio lpi103-2 a un subdirectorio copy1.
Utilizamos ls -R para mostrar el
árbol de directorios resultante.
Listado 10. Copia repetitiva
[ian@echidna lpi103-2]$ cp -pR . copy1
cp: cannot copy a directory, `.', into itself, `copy1'
[ian@echidna lpi103-2]$ ls -R
.:
backup copy1 sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab
./backup:
text1.bkp.1 text1.bkp.2
./copy1:
text2 text3 text5 xaa yaa yab
|
Antes mencionamos que rmdir sólo elimina
los directorios vacíos. Podemos usar -r (o
-R o la opción --repetitiva)
para hacer que el comando rm elimine ambos
archivos y directorios según se muestra en el Listado 11, donde eliminamos el
directorio copy1 que acabamos de crear, junto con sus contenidos, incluyendo
el subdirectorio de backup y sus contenidos.
Listado 11. Eliminación repetitiva
[ian@echidna lpi103-2]$ rm -r copy1
[ian@echidna lpi103-2]$ ls -R
.:
backup sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab
./backup:
text1.bkp.1 text1.bkp.2
|
Si usted tiene archivos que no puedan ser escritos por usted, es posible que necesite agregar
la opción -f para forzar la eliminación. Esto lo hace con frecuencia
el usuario raíz al realizar la limpieza, pero se debe advertir que puede perder
datos valiosos su no es cuidadoso.
Con frecuencia usted puede necesitar realizar una única operación en muchos objetos del sistema de archivos, sin operar en todo el árbol como recién hicimos con las operaciones repetitiva. Por ejemplo, usted podría desear encontrar los tiempos de modificación de todos los archivos de texto que creamos en lpi103-2, sin listar los archivos divididos. Aunque esto es fácil con nuestro pequeño directorio, es mucho más difícil en un sistema de archivos grande.
Para resolver este problema, utilice el soporte del comodín que esté incorporado en el bash shell. Este soporte, también denominado "globbing" (porque fue originalmente implementado como un programa denominado /etc/glob), le permite especificar múltiples archivos utilizando el patrón de comodines.
Una secuencia que contenga cualquiera de los caracteres '?', '*' o '[', es un patrón de comodines. Globbing es el proceso por el cual shell (o posiblemente otro programa) expande estos patrones a una lista de nombres de rutas que concuerden con el patrón. La concordancia se realiza de la siguiente manera:
- ?
- concuerda con cualquier carácter único.
- *
- concuerda con cualquier cadena, incluyendo una cadena vacía.
- [
- presenta una clase de caracteres.Una clase de caracteres es una cadena que
no está vacía, terminada por un ']'. Una concordancia significa la combinación de cualquier
carácter único encerrado por corchetes. Existen unas pocas consideraciones
especiales.
- Los caracteres '*' y '?' concuerdan entre sí. Si usted los utiliza en los nombres de los archivos, necesita ser cuidadoso con respecto al entrecomillado o al escape apropiado.
- Dado que la cadena no debe estar vacía y debe terminar con un ']', usted deberá colocar un ']' primero en la cadena si desea que concuerde.
- El carácter '-' entre otros dos representa un rango que incluye los otros dos caracteres y todos los caracteres entre ellos en la secuencia compaginada. Por ejemplo, [0-9a-fA-F] representa cualquier dígito hexadecimal en minúsculas. Usted puede combinar un '-' colocándolo ya sea al principio o al final en un rango.
- El carácter '!' especificado como el primer carácter de un rango complementa el rango de manera que concuerda con cualquier carácter salvo con los caracteres restantes. Por ejemplo, [!0-9] significa cualquier carácter salvo los dígitos del 0 al 9. Un '!' en cualquier posición que no sea la primera concuerda consigo mismo. Recuerde que '!' también es utilizado con la función del histórico de shell, de manera que usted debe ser cuidadoso para salir adecuadamente de él.
Nota: Los patrones de comodines y los patrones de expresión normal comparten algunas características, pero no son los mismos. Preste mucha atención.
Globbing se aplica por separado en cada componente de un nombre de ruta. Usted no puede
combinar una '/', ni incluir una en un rango. Puede usarla en cualquier lugar que pueda
especificar los nombres de archivos o directorios múltiples, por ejemplo en los comandos
ls, cp,
mv, o rm.
En el Listado 12, primero creamos un par de archivos con nombres extraños y luego use
los comandos ls y rm
con los patrones de comodines.
Listado 12. Ejemplos de los patrones de comodines
[ian@echidna lpi103-2]$ echo odd1>'text[*?!1]'
[ian@echidna lpi103-2]$ echo odd2>'text[2*?!]'
[ian@echidna lpi103-2]$ ls
backup text1 text2 text3 text5 xaa yaa
sedtab text[*?!1] text[2*?!] text4 text6 xab yab
[ian@echidna lpi103-2]$ ls text[2-4]
text2 text3 text4
[ian@echidna lpi103-2]$ ls text[!2-4]
text1 text5 text6
[ian@echidna lpi103-2]$ ls text*[2-4]*
text2 text[2*?!] text3 text4
[ian@echidna lpi103-2]$ ls text*[!2-4]* # Surprise!
text1 text[*?!1] text[2*?!] text5 text6
[ian@echidna lpi103-2]$ ls text*[!2-4] # Another surprise!
text1 text[*?!1] text[2*?!] text5 text6
[ian@echidna lpi103-2]$ echo text*>text10
[ian@echidna lpi103-2]$ ls *\!*
text[*?!1] text[2*?!]
[ian@echidna lpi103-2]$ ls *[x\!]*
text1 text[*?!1] text10 text2 text[2*?!] text3 text4 text5 text6 xaa xab
[ian@echidna lpi103-2]$ ls *[y\!]*
text[*?!1] text[2*?!] yaa yab
[ian@echidna lpi103-2]$ ls tex?[[]*
text[*?!1] text[2*?!]
[ian@echidna lpi103-2]$ rm tex?[[]*
[ian@echidna lpi103-2]$ ls *b*
sedtab xab yab
backup:
text1.bkp.1 text1.bkp.2
[ian@echidna lpi103-2]$ ls backup/*2
backup/text1.bkp.2
[ian@echidna lpi103-2]$ ls -d .*
. ..
|
Notas:
- La complementación junto con un '*' puede dar algunas sorpresas. El patrón '*[!2-4]' concuerda con la parte más larga de un nombre que no tenga 2, 3 o 4 a continuación de él, que es combinado tanto por text[*?!1] como por text[2*?!]. Entonces ahora ambas sorpresas deberían ser claras.
- Así como con los anteriores ejemplos de
ls, si la expansión del patrón da como resultado un nombre que es el nombre de un directorio y no se especifica la opción-d, entonces los contenidos de ese directorio serán listados (como en nuestro anterior ejemplo para el patrón '*b*'). - Si el nombre de un archivo comienza con un punto (.), entonces ese carácter debe
concordar explícitamente. Observe que sólo el último comando
lslistó las dos entradas especial al directorio (. y ..).
Recuerde que los caracteres de comodines en un comando son factibles de ser expandidos por shell, lo que puede llevar a resultados inesperados. Más aún, si especifica un patrón que no concuerde con algún objeto del sistema de archivos, entonces POSIX requiere que la cadena original de patrones sea pasada al comando. Algunas implementaciones anteriores pasaron una lista nula al comando, de manera que es posible que usted se encuentre con antiguos scripts que tengan una conducta inusual. Mostramos estos puntos en el Listado 13.
Listado 13. Sorpresas de los patrones de comodines
[ian@echidna lpi103-2]$ echo text*
text1 text10 text2 text3 text4 text5 text6
[ian@echidna lpi103-2]$ echo "text*"
text*
[ian@echidna lpi103-2]$ echo text[[\!?]z??
text[[!?]z??
|
Para obtener más información sobre globbing, vea
man 7 glob. Necesitará al número de la sección,
ya que también existe información sobre glob en la sección 3. La mejor forma de comprender
todas las distintas interacciones de shell es a través de la práctica, entonces intente con estos
comodines cuando tenga la oportunidad de hacerlo. Recuerde intentar con
ls para verificar su patrón de comodines antes
d permitir cp, mv, o
peor aún, rm hacer algo inesperadamente.
Ahora veremos el comando touch, el que puede
actualizar el acceso a los archivos y los momentos en los que se produjeron modificaciones o crear
archivos vacíos. En la siguiente parte, veremos cómo utilizar esta información para encontrar archivos y
directorios. Continuaremos usando el directorio lpi103-2 para nuestros ejemplos.
También veremos las distintas formas en las que usted puede especificar las
marcaciones de tiempo.
El comando touch sin opciones toma uno o más
nombres de archivos como parámetros y actualiza el momento de la modificación de
los archivos. Ésta es la misma marcación de tiempo que aparece normalmente con un listado largo
de directorios. En el Listado 14 usamos nuestro viejo amigo
echo para crear un pequeño archivo denominado f1, y luego
use un largo listado de directorios para mostrar el tiempo de la modificación (o
mtime). En este caso, también es el momento en el que el archivo
fue creado. Luego utilizamos el comando sleep para
esperar 60 segundos y volver a ejecutar ls. Observe que
la marcación de tiempo para el archivo ha cambiado en un minuto.
Listado 14. Actualización del momento de la modificación con touch
[ian@echidna lpi103-2]$ echo xxx>f1; ls -l f1; sleep 60; touch f1; ls -l f1
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:24 f1
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
|
Si usted especifica el nombre de archivo de un archivo que no existe, entonces
touch normalmente creará un archivo en blanco,
salvo que usted especifique la opción -c o
--no-create.El Listado 15 muestra ambos comandos.
Observe que sólo se crea f2.
Listado 15. Creación de archivos en blanco con touch
[ian@echidna lpi103-2]$ touch f2; touch -c f3; ls -l f*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 f2
|
El comando touch también puede definir el momento de la
modificación de un archivo (también conocido como mtime) a una fecha y hora determinadas
usando ya sea las opciones -d o
-t. La opción -d
es muy flexible en los formatos de la fecha y la hora que aceptará, al tiempo que
la opción -t necesita por lo menos MMDDhhmm
con valores opciones para el año y los segundos. El Listado 16 muestra algunos ejemplos.
Listado 16. Definición de mtime con touch
[ian@echidna lpi103-2]$ touch -t 200908121510.59 f3
[ian@echidna lpi103-2]$ touch -d 11am f4
[ian@echidna lpi103-2]$ touch -d "last fortnight" f5
[ian@echidna lpi103-2]$ touch -d "yesterday 6am" f6
[ian@echidna lpi103-2]$ touch -d "2 days ago 12:00" f7
[ian@echidna lpi103-2]$ touch -d "tomorrow 02:00" f8
[ian@echidna lpi103-2]$ touch -d "5 Nov" f9
[ian@echidna lpi103-2]$ ls -lrt f*
-rw-rw-r--. 1 ian ian 0 2009-07-31 18:31 f5
-rw-rw-r--. 1 ian ian 0 2009-08-12 12:00 f7
-rw-rw-r--. 1 ian ian 0 2009-08-12 15:10 f3
-rw-rw-r--. 1 ian ian 0 2009-08-13 06:00 f6
-rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 f4
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 f2
-rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 f8
-rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 f9
|
Si no está seguro de qué fecha podría ser resuelta por una expresión de fecha, puede
usar el comando date para saberlo. También acepta
la opción -d y puede resolver la misma clase de
formatos de fecha que touch puede resolver.
Puede usar la opción -r (o
--reference) junto con un nombre de archivo de
referencia a fin de indicar que touch (o
date) deberían usar la marcación de tiempo de un archivo
existente. El Listado 17 muestra algunos ejemplos.
Listado 17. Marcaciones de tiempo de los archivos de referencia
[ian@echidna lpi103-2]$ date
Fri Aug 14 18:33:48 EDT 2009
[ian@echidna lpi103-2]$ date -r f1
Fri Aug 14 18:25:50 EDT 2009
[ian@echidna lpi103-2]$ touch -r f1 f1a
[ian@echidna lpi103-2]$ ls -l f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a
|
Un sistema Linux registra tanto el tiempo de modificación de un archivo como el tiempo de
acceso. Estos también son conocidos respectivamente como
mtime y atime. Ambas marcaciones de tiempo están definidas con el mismo
valor cuando se crea un archivo, y ambas son restauradas cuando es modificado. Si se
accede a un archivo, el tiempo del acceso es entonces actualizado, aun si no fuera modificado
el archivo. Para nuestro último ejemplo con
touch, veremos los tiempos de acceso
del archivo. La opción -a (o
--time=atime,
--time=access o
--time=use) especifican que el tiempo de acceso debería
ser actualizado. El Listado 18 usa el comando cat
para acceder al archivo f1 y mostrar sus contenidos. Entonces usamos
ls -l y ls -lu para
mostrar los momentos de la modificación y de acceso respectivamente para f1 y f1a,
que creamos utilizando f1 como un archivo de referencia. Luego restauramos el tiempo de
acceso de f1 al de f1a usando touch -a y
para verificar que haya sido restaurado.
Listado 18. Momento del acceso y de la modificación
[ian@echidna lpi103-2]$ ls -lu f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:39 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a
[ian@echidna lpi103-2]$ ls -l f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a
[ian@echidna lpi103-2]$ touch -a -r f1a f1
[ian@echidna lpi103-2]$ ls -lu f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a
|
A fin de obtener la información completa sobre las muchas especificaciones de hora y
fecha permitidas, vea las páginas man o info para obtener detalles sobre los comandos
touch y date.
Ahora que hemos cubierto el tema sobre los archivos y los directorioscon el gran
martillo repetitivo que golpea todo, y con el martillo de globbing que golpea más
selectivamente, veamos el comando find,
el que puede ser más precido a el cuchillo de un cirujano. El comando
find es utilizado para buscar archivos en uno o más árboles
de directorios, basándose en los criterios tales como nombre, marcación de tiempo o tamaño.
Nuevamente, utilizaremos el directorio lpi103-2.
El comando find buscará los archivos o los
directorios utilizando todo o parte del nombre, o mediante otro criterio de búsqueda,
tales como el tamaño, el tipo, el propietario del archivo, la fecha de creación o la fecha del
último acceso. La búsqueda más básica es una por nombre o parte del mismo. El Listado 19 muestra un
ejemplo de nuestro directorio lpi103-2 donde primero buscamos todos los archivos
que tienen ya sea un '1' o una 'k' en su nombre, luego realizamos algunas búsquedas de rutas
que están explicadas en las notas que aparecen más abajo.
Listado 19. Buscar archivos por nombre
[ian@echidna lpi103-2]$ find . -name "*[1k]*"
./f1a
./f1
./text10
./backup
./backup/text1.bkp.1
./backup/text1.bkp.2
./text1
[ian@echidna lpi103-2]$ find . -ipath "*ACK*1"
./backup/text1.bkp.1
[ian@echidna lpi103-2]$ find . -ipath "*ACK*/*1"
[ |
Notas:
- Los patrones que usted puede utilizar son los patrones de los comodines shell como los que vimos antes bajo el título Comodines y globbing.
- Usted puede utilizar
-pathen lugar de-namea fin de combinar las rutas completas en lugar de sólo los nombres de los archivos de base. En este caso, el patrón may abarca los componentes de las rutas, a diferencia de las concordancias comunes de comodines, los que concuerdan sólo con una única parte de una ruta. - Si desea una búsqueda intensiva en cuanto a la tipografía, como se muestra antes con el uso de
ipath, preceda las opcionesfindque buscan en una cadena o patrón con una 'i'. - Si desea buscar un archivo o directorio cuyo n ombre comience con un punto, tal como .bashrc o el directorio actual (.), entonces debe especificar un punto líder como parte del patrón. De lo contrario, las búsquedas por nombre ignorarán estos archivos o directorios.
En el primer ejemplo precedente, encontramos ambos archivos y un directorio (./backup).
Use el parámetro -type junto con una tipografía de una letra
para acotar la búsqueda. Use 'f' para los archivos normales, 'd' para los
directorios y 'l' para los vínculos simbólicos. Vea en la página man
find para obtener otras posibles tipografías. El Listado 20 muestra
el resultado de la búsqueda de los directorios
(-type d) solos y con un nombre de archivo (* o
todo, en este caso).
Listado 20. Buscar archivos por tipo
[ian@echidna lpi103-2]$ find . -type d
.
./backup
[ian@echidna lpi103-2]$ find . -type d -name "*"
.
./backup
|
Observe que la especificación del -type d sin ninguna froma de
especificación de nombre muestra los directorios que tienen un punto líder en sus
nombres (sólo el directorio actual en este caso), como el caso del
"*" comodín.
También podemos buscar por tamaño del archivo, ya sea por un tamaño determinado (n) o por
archivos que son más grandes (+n) o más pequeños que un valor dado (-n). Al
utilizar tanto los límites de tamaño superiores e inferiores, podemos encontrar archivos
cuyo tamaño se encuentre dentro de un rango dado. Por omisión, la opción -size
de find asume una unidad de 'b' para los bloques de
512 bytes. Entre otras opciones, especifique 'c' para los bytes, o 'k' para los
kilobytes. En el Listado 21, primero buscamos todos los archivos con tamaño 0, y luego
todos con tamaño de 24 o 25 bytes. Observe que especificar
-empty en lugar de
-size 0 también busca los archivos en blanco.
Listado 21. Buscar archivos por tamaño
[ian@echidna lpi103-2]$ find . -size 0
./f1a
./f6
./f8
./f2
./f3
./f7
./f4
./f9
./f5
[ian@echidna lpi103-2]$ find . -size -26c -size +23c -print
./text2
./text5
./backup/text1.bkp.1
./backup/text1.bkp.2
./text1
|
El segundo ejemplo en el Listado 21 introduce la opción
-print que es un ejemplo de una
acción que puede ser tomada sobre los resultados devueltos por la búsqueda.
En bash shell. Ésta es la acción por omisión si no se especifica ninguna.
En algunos sistemas y en algunos shells, se requiere una acción; de lo contrario, no
existe ninguna salida.
Otras acciones icluyen -ls, que imprime la información
del archivo equivalente a la del comando
ls -lids, y
-exec, que ejecuta un comando para cada archivo.
-exec debe ser finalizar con un punto y coma,
que debe ser escapado para evitar que el shell lo interprete primero. También
especifique {} donde desee utilizar el archivo devuelto en el comando.
Recuerde que las llaves también tienen un significado para el shell y deben ser
escapadas (o entrecomilladas). El Listado 22 muestra cómo las opciones
-ls y -exec
pueden ser utilizadas para listar la información del archivo. Observe que la segunda forma
no lista la información del inode.
Listado 22. Buscar y tomar acciones en los archivos
[ian@echidna lpi103-2]$ find . -size -26c -size +23c -ls
933893 4 -rw-rw-r-- 1 ian ian 25 Aug 11 14:27 ./text2
933900 4 -rw-rw-r-- 1 ian ian 24 Aug 11 18:47 ./text5
934193 4 -rw-rw-r-- 1 ian ian 24 Aug 12 15:36 ./backup/text1.bkp.1
934195 4 -rw-rw-r-- 1 ian ian 24 Aug 12 15:36 ./backup/text1.bkp.2
933892 4 -rw-rw-r-- 1 ian ian 24 Aug 11 14:02 ./text1
[ian@echidna lpi103-2]$ find . -size -26c -size +23c -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 25 2009-08-11 14:27 ./text2
-rw-rw-r--. 1 ian ian 24 2009-08-11 18:47 ./text5
-rw-rw-r--. 1 ian ian 24 2009-08-12 15:36 ./backup/text1.bkp.1
-rw-rw-r--. 1 ian ian 24 2009-08-12 15:36 ./backup/text1.bkp.2
-rw-rw-r--. 1 ian ian 24 2009-08-11 14:02 ./text1
|
La opción -exec puede ser utilizada con tantos fines
como pueda soñar su imaginación. Por ejemplo:
find . -empty -exec rm '{}' \;
quita todos los archivos en blanco de un árbol de directorios, mientras que
find . -name "*.htm" -exec mv '{}' '{}l' \;
renombra a todos los archivos .htm a archivos .html files.
Para nuestros ejemplos finales de buscar, usamos las
marcaciones de tiempo descritas con el comando touch a fin de
ubicar los archivos que tengan marcaciones de tiempo determinadas. El Listado 23 nuestra tres
ejemplos:
- Cuando se usa con
-mtime -2, el comandofindbusca todos los archivos modificados dentro de los últimos dos días. Un día en este caso es un período de 24 horas enr elación con la fecha y hora actuales. Observe que usted usaría-atimesi deseara buscar archivos basados en el momento del acceso en lugar del momento de la modificación. - Al agregar la opción
-daystartsignifica que deseamos considerar los días como días calendarios, comenzando a la medianoche. Ahora el archivo f3 es excluído de la lista. - Finalmente, mostramos cómo usar un rango de tiempo en minutos en lugar de hacerlo en días para buscar los archivos modificados desde hace una hora (60 minutos) y 10 horas (600 minutos).
Listado 23. Buscar archivos por marcación de tiempo
[ian@echidna lpi103-2]$ date
Sat Aug 15 00:27:36 EDT 2009
[ian@echidna lpi103-2]$ find . -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1
-rw-rw-r--. 1 ian ian 0 2009-08-13 06:00 ./f6
-rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 ./f8
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2
-rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10
-rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 ./f4
-rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 ./f9
[ian@echidna lpi103-2]$ find . -daystart -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1
-rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 ./f8
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2
-rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10
-rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 ./f4
-rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 ./f9
[ian@echidna lpi103-2]$ find . -mmin -600 -mmin +60 -type f -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2
-rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10
|
Las páginas man para el comando find pueden ayudarlo
a conocer la amplia gama de opciones que no podemos cubrir en esta breve
introducción.
Con frecuencia los nombres de los archivos tienen un sufijo tales como gif, jpeg o html que dan una clave
de lo que el archivo podría contener. Linux no requiere dichos sufijos y generalmente
no los utiliza para identificar un tipo de archivo. Sabiendo con qué tipo de archivo
usted está tratando lo ayuda a saber qué programa usar para mostrarlo o
manejarlo. El comando file le indica algo acerca
del tipo de datos de uno o más archivos. El Listado 24 muestra algunos
ejemplos de uso del comando file.
Listado 24. Identificación de los contenidos de los archivos
[ian@echidna lpi103-2]$ file backup text1 f2 ../p-ishields.jpg /bin/echo
backup: directory
text1: ASCII text
f2: empty
../p-ishields.jpg: JPEG image data, JFIF standard 1.02
/bin/echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.18, stripped
|
El comando file intenta clasificar cada archivo
utilizando tres tipos de prueba. Las pruebas del sistema de archivos usan los resultados
del comando stat para determinar si un archivo o un directorio
está en blanco, por ejemplo . Las denominadas pruebas mágicas verifican los
contenidos de un archivo que lo identifican. Estas firmas también son conocidas
como números mágicos. Finalmente, las pruebas de lenguaje observan el contenido
de los archivos de texto para intentar determinar si un archivo es XML, de fuente de lenguaje C o C++,
un archivo troff, o algún otro archivo que sea considerado fuente para alguna clase de
procesador de lenguajes. El primer tipo que se encuentra es
informado salvo que la opción -k o
--keep-goingsea especificada.
El comando file tiene muchas opciones que usted puede
aprender utilizando las páginas man. El Listado 25 muestra cómo usar la opción
-i (o --mime)
para mostrar el tipo de archivo como una cadena MIME en lugar de la salida normal
legible por el humano.
Listado 25. Identificación de los contenidos de los archivos como MIME
[ian@echidna lpi103-2]$ file -i backup text1 f2 ../p-ishields.jpg /bin/echo
backup: application/x-directory; charset=binary
text1: text/plain; charset=us-ascii
f2: application/x-empty; charset=binary
../p-ishields.jpg: image/jpeg; charset=binary
/bin/echo: application/x-executable; charset=binary
|
Los archivos de números mágicos son también administrador por el comando
file. Nuevamente, vea las páginas man para obtener más
información.
Nota: El comando identify que forma parte del
paquete ImageMagick es una herramienta adicional que brinda más detalles
al identificar los tipos de archivo de imagen.
Cuando realiza un back up, el archivo o la transmisión de archivos, es
común comprimir los archivos. En un entorno de Linux, dos programas de compresión
conocidos son gzip y
bzip2. El comando gzip
usa el algoritmo Lempel-Ziv, al tiempo que
bzip2 usa el algoritmo de clasificación en bloque
Burrows-Wheeler.
La compresión generalmente funciona bien en los archivos de texto. Muchos formatos de imagen
comprimen los datos, de manera que es posible que la compresión no funcione bien en estos o en
otros archivos binarios. A fin de ilustrar la compresión en un archivo de texto razonablemente grande,
copiemos /etc/los servicios a un directorio que hayamos estado usando y comprimámoslo
utilizando gzip como se muestra en el Listado 26. Usamos la opción
-p de cp para
preservar la marcación de tiempo de /etc/servicios. Observe que el archivo comprimido tiene
la misma marcación de tiempo y un sufijo .gz.
Listado 26. Compresión con gzip
[ian@echidna lpi103-2]$ cp -p /etc/services
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna lpi103-2]$ gzip services
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 124460 2009-04-10 04:42 services.gz
|
Se descomprime un archivo gzippeado utilizando la opción -d
de gzip o, más comúnmente, el comando
gunzip. El Listado 27 muestra la primera de estas
opciones. Observe que el archivo descomprimido ahora tiene el nombre y la marcación de tiempo
del archivo original.
Listado 27. Descompresión con gzip
[ian@echidna lpi103-2]$ gzip -d services.gz
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
|
El comando bzip2 opera en una manera similar
a gzip como se muestra en el Listado 28.
Listado 28. Compresión con bzip2
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna lpi103-2]$ bzip2 services
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 113444 2009-04-10 04:42 services.bz2
[ian@echidna lpi103-2]$ bunzip2 services.bz2
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
|
Diferencias entre gzip y bzip2
Por el diseño, muchas de las opciones de bzip2 son las mismas que
las de gzip, pero los dos comandos no tiene
opciones idénticas. Es posible que usted haya notado que en ambos ejemplos,
el archivo descomprimido tenía el mismo nombre y la misma marcación de tiempo que el original.
Sin embargo, renombra o tocar el archivo comprimido puede cambiar esta
conducta. El comando gzip tiene la opción
-N o --name para
forzar el nombre y la marcación de tiempo que serán preservados, pero
bzip2 no. El comando
gzip también tiene una opción
-l para mostrar la información acerca del archivo
comprimido, incluyendo el nombre que será usado cuando sea
decomprimido. El Listado 29 muestra algunas de estas diferencias entre los
dos comandos.
Listado 29. Algunas diferencias entre gzip y bzip2
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna ~]$ gzip -N services
[ian@echidna ~]$ touch services.gz
[ian@echidna ~]$ mv services.gz services-x.gz
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 124460 2009-09-23 14:08 services-x.gz
[ian@echidna ~]$ gzip -l services-x.gz
compressed uncompressed ratio uncompressed_name
124460 630983 80.3% services-x
[ian@echidna ~]$ gzip -lN services-x.gz
compressed uncompressed ratio uncompressed_name
124460 630983 80.3% services
[ian@echidna ~]$ gunzip -N services-x.gz
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna ~]$
[ian@echidna ~]$ bzip2 services
[ian@echidna ~]$ mv services.bz2 services-x.bz2
[ian@echidna ~]$ touch services-x.bz2
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 113444 2009-09-23 14:10 services-x.bz2
[ian@echidna ~]$ bunzip2 services-x.bz2
[ian@echidna ~]$ ls -l serv*
-rw-rw-r--. 1 ian ian 630983 2009-09-23 14:10 services-x
[ian@echidna ~]$ rm services-x # Don't need this any more
|
Tanto gzip como bzip2
aceptarán la entrada de stdin. Ambos dan soporte a la opción
-c para dirigir la salida a stdout.
Existen otros dos comandos asociados con
bzip2
- El comando
bzcatdescomprime los archivos a stdout y es equivalente abzip2 -dc. - El comando
bzip2recoverintenta recuperar los datos de los archivos dañados de bzip2.
Las páginas man lo ayudarán a conocer más detalles acerca de las otras opciones de
gzip y bzip2.
Otras herramientas de compresión
Dos programa más antiguos, compress y
uncompress, son todavía frecuentemente encontrados en los sistemas Linux
y UNIX.
Además, los comandos zip y
unzip del proyecto Info-ZIP están implementados
para Linux. Estos brindar las funciones de compresión de plataformas cruzadas
que están disponibles en un amplio rango de hardware y de los sistemas operativos. Sepa
que no todos los sistemas operativos les dan soporte a los mismos atributos de archivos o
a las capacidades del sistema de archivos. Si descarga un producto zippeado y lo dezippea
en un sistema Windows, luego transfiere los archivos resultantes a un CD o DVD
para instalarlos en Linux, es probable que experimente problemas con la instalación porque,
por ejemplo, el sistema Windows no les da soporte a los vínculos simbólicos que forman
parte del grupo de archivos original descomprimido.
Para obtener más información sobre estos u otros programas de compresión, vea sus respectivas páginas man .
Los comandos tar, cpio y
dd son normalmente utilizados para hacer un backup
de los grupos de archivos o incluso de todas las particiones, ya sea para el archivo o
para la transmisión a otros usuario o sitio. El examen 201 que forma parte de la
certificación de LPIC-2, enfoca las consideraciones sobre el backup con mayores
detalles.
Existen tres enfoques generales para el backup:
- Un backup diferencial o acumulativo es un backup de todo lo que ha cambiado desde el último backup total. La recuperación requiere el último backup total más el backup diferencial más reciente.
- Un backup gradual es un backup de sólo aquellos cambios producidos desde el último backup gradual. La recuperación requiere el último backup total además de todos los backups graduales (en orden) desde el último backup total.
- Un backup total es un backup completo, generalmente de todo el sistema
de archivos, directorios o grupos de archivos relacionados. Éste lleva el mayor
tiempo de creación, de manera que es usualmente utilizado con uno de los otros dos
enfoques.
Estos comandos, junto con otros comandos que usted haya aprendido en este artículo le brindan las herramientas para realizar cualquiera de estas tareas de backup.
tar (originalmente de Tape ARchive)
crea un archivo o tarfile o tarball, de un grupo
de archivos de entrada o directorios, también restaura los archivos de dicha
colección de archivos. Si un directorio es dado como la entrada a un
tar, todos los archivos y subdirectorios son
automáticamente incluidos, lo que hace que tar sea
muy conveniente para archivar los sub árboles de la estructura de su directorio.
La salida puede ser a un archivo, un dispositivo tal como una cinta o un disquete, o a stdout. El
lugar de la salida es especificado con la opción -f,
Otras opciones comunes son -c para crear
una colección de archivos, -x para extraer una colección de archivos,
-v para una salida prolija, la que lista los archivos
que serán procesados, -z para usar la compresión con gzip,
y -j para usar la compresión con bzip2. Muchas opciones
tar tienen una forma breve que utiliza un único
guión y una forma larga que usa un par de guiones. Las formas breves se muestran
aquí. Vea las páginas man para ver las largas y para obtener opciones
adicionales.
El Listado 30 muestra cómo crear un backup de nuestro directorio lpi103-2 utilizando
tar.
Listado 30. Backup de nuestro directorio lpi103-2 utilizando tar
[ian@echidna lpi103-2]$ tar -cvf ../lpitar1.tar .
./
./text3
./yab
...
./f5
|
Generalmente deseará comprimir los archivos de la colección de archivos para ahorrar espacio o reducir
el tiempo de transmisión. La versión GNU del comando tar
cle permite realizar esto con una única opción —
-z para comprimir utilizando
gzip y -b para c omprimir
usando bzip2. El Listado 31 muestra
el uso de la opción -z y la diferencia en
tamaño entre las dos colecciones de archivos.
Listado 31. Compresión de la colección de archivos tar con gzip
[ian@echidna lpi103-2]$ tar -zcvf ../lpitar2.tar ~/lpi103-2/
tar: Removing leading `/' from member names
/home/ian/lpi103-2/
/home/ian/lpi103-2/text3
/home/ian/lpi103-2/yab
...
/home/ian/lpi103-2/f5
[ian@echidna lpi103-2]$ ls -l ../lpitar*
-rw-rw-r--. 1 ian ian 30720 2009-09-24 15:38 ../lpitar1.tar
-rw-rw-r--. 1 ian ian 881 2009-09-24 15:39 ../lpitar2.tar
|
El Listado 31 también muestra otra característica importante de
tar. Utilizamos una ruta absoluta de directorio, y
la primera línea de la salida le indica que tar está
eliminando la primera barra (/) de los nombres ded los miembros. Esto les permite a los archivos
ser restaurados a algún otro lugar para la verificación y puede ser especialmente
importante si está intentando restaurar los archivos del sistema. Si realmente desea
almacenar los nombres absolutos, use la opción -p. También es
una buena idea evitar la combinación de los nombres de ruta absolutos con los relativos
al crear una colección de archivos, ya que todo será relativo al restaurar de dicha
colección de archivos.
El comando tar puede ser añadido a los archivos adicionales
en el caso de una colección de archivos que utilice la opción -r o
--append. Esto puede causar múltiples copias de un archivo
en la colección de archivos. En tal caso, el último será
restaurado durante una operación de restauración. Usted podrá usar la opción
--occurrence para seleccionar un archivo determinado
entre múltiples archivos. Si la colección de archivos se encuentra en un sistema de archivos normal en lugar de
una cinta, puede utilizar la opción -u o
--update para actualizar dicha colección de archivos. Esto
funciona como el agregado de una colección de archivos, salvo que la marcación de tiempo de los
archivos en la colección de archivos es comparada con la de sistema de archivos, y sólo se agregarán
los archivos que hayan sido modificados desde la versión de la colección de archivos. Como hemos
mencionado, esto no funciona para las colecciones de archivos en cinta.
El comando tar también puede comparar las colecciones de archivos con
el sistema de archivos actual y restaurar los archivos de dichas colecciones. Use la opción
-d, --compare, o
--diff para realizar las comparaciones. La sallida mostrará
archivos cuyos contenidos difieran, así como también los archivos cuyas marcaciones de
tiempo difieran. Normalmente, sólo los archivos que difieran, si hubiera alguno, son listados. Use
la opción -v mencionada anteriormente para una salida prolija.
La opción -C o
--directory le indica a
tar realizar una operación comenzando del directorio
especificado en lugar de hacerlo del directorio actual.
El Listado 32 muestra algunos ejemplos. Utilizamos touch para
modificar la marcación de tiempo del archivo f1, luego mostramos la comparación las colecciones de archivos
de las operaciones de comparación de tar antes de restaurar f1 de una de
nuestras colecciones de archivos. Utilizamos una variedad de formas de opciones como ilustración.
Listado 32. Comparación y restauración utilizando tar
[ian@echidna lpi103-2]$ touch f1
[ian@echidna lpi103-2]$ tar --diff --file ../lpitar1.tar .
./f1: Mod time differs
[ian@echidna lpi103-2]$ tar -df ../lpitar2.tar -C /
home/ian/lpi103-2/f1: Mod time differs
[ian@echidna lpi103-2]$ tar -xvf ../lpitar1.tar ./f1 # See below
./f1
[ian@echidna lpi103-2]$ tar --compare -f ../lpitar2.tar --directory /
|
Los archivos o los directorios que usted especifique para la restauración deberán concordar con el nombre en
la colección de archivos. El intento de restauración de sólo f1 en lugar de ./f1 en este caso
no funcionaría. Puede estar usando globbing, pero necesita ser cuidadoso para evitar
restaurar más o menos de lo que desea. Puede utilizar la opción
--list o -t para listar los contenidos
de la colección de archivos si no está seguro de lo que hay en una colección de archivos. El Listado
33 muestra un ejemplo de una especificación de comodines que habría restaurado más archivos que sólo
./f1.
Listado 33. Listado de los contenidos de la colección de archivos con tar
[ian@echidna lpi103-2]$ tar -tf ../lpitar1.tar "*f1*"
./f1a
./f1
|
Puede usar el comando find para seleccionar los archivos
para el archivo y luego direccionar el resultado a tar. Hablaremos de esta
técnica como parte del debate sobre cpio,
pero el mismo método funciona para tar.
Así como con los otros comandos que ha estudiado aquí, existen muchas opciones que no están cubiertas en esta breve introducción. Vea la página man o info para obtener más detalles.
El comando cpio opera en la modalidad copy-out
para crear una colección de archivos, la modalidad copy-in para restaurarla, o la
modalidad copy-pass para copiar un grupo de archivos de un lugar a
otro. Usted utiliza la opción -o o
--create para la modalidad copy-out, la opción
-i o --extract
para la modalidad copy-in, y la opción -p o
--pass-through para la modalidad copy-pass. La entrada
es una lista de archivos provista en stdin. La salida es ya sea a stdout o a un
dispositivo o archivo especificado con la opción -f o
--file.
El Listado 34 muestra cómo generar una lista de archivos utilizando el comando
find y luego direccionar la lista a
cpio. Observe el uso de la opción
-print0 en
find para generar cadenas con terminaciones nulas para los
nombres de los archivos, y la correspondiente opción --null
en cpio para leer este formato. Esto manejará
correctamente los nombres de los archivos que contengan blancos o caracteres de fin
de línea. La opción -depth indica
find listar las entradas al directorio antes del nombre
del mismo. En este ejemplo, simplemente creamos dos colecciones de archivos de nuestro
directorio lpi103-2, uno con nombres relativos y otro con nombres absolutos.
No utilizamos las muchas capacidades de find para
restringir los archivos seleccionados, tal como buscar sólo los archivos modificados esta
semana.
Listado 34. Backup de un directorio utilizando cpio
[ian@echidna lpi103-2]$ find . -depth -print0 | cpio --null -o > ../lpicpio.1
3 blocks
[ian@echidna lpi103-2]$ find ~/lpi103-2/ -depth -print0 | cpio --null -o > ../lpicpio.2
4 blocks
|
Si quisiera ver los archivos listados como son archivados, agregue la opción
-v a
cpio.
El comando cpio en la modalidad copy-in (opción
-i o --extract) puede
listar los contenidos de un archivo o restaurar los archivos seleccionados. Cuando liste
los archivos especificando la opción --absolute-filenames
se reduce la cantidad de mensajes ajenos que alguna versión anterior
de cpio de otra manera emitirá a medida que quiten cualquier
carácter inicial / de cada ruta que tenga uno. Esta opción es discretamente
ignorada en muchas implementaciones actuales. La salida del listado selectivo de nuestras
anteriores colecciones de archivos se muestra en el Listado 35.
Listado 35. Listado y restauración de los archivos seleccionados utilizando cpio
[ian@echidna lpi103-2]$ cpio -i --list "*backup*" < ../lpicpio.1
backup
backup/text1.bkp.1
backup/text1.bkp.2
3 blocks
[ian@echidna lpi103-2]$ cpio -i --list absolute-filenames "*text1*" < ../lpicpio.2
/home/ian/lpi103-2/text10
/home/ian/lpi103-2/backup/text1.bkp.1
/home/ian/lpi103-2/backup/text1.bkp.2
/home/ian/lpi103-2/text1
4 blocks
|
El Listado 36 muestra cómo restaurar todos los archivos con "text1" en su ruta
al subdirectorio temporal. Algunos de estos están en los subdirectorios. A diferencia de
tar, usted necesitará especificar la opción
-d o
--make-directories explícitamente si su árbol de
directorios no existe. Más aún,
cpio no reemplazará ningún archivo más nuevo del sistema de archivos
con copias de la colección de archivos salvo que usted especifique la opción
-u o
--unconditional.
Listado 36. Restauración de los archivos seleccionados utilizando cpio
[ian@echidna lpi103-2]$ mkdir temp
[ian@echidna lpi103-2]$ cd temp
[ian@echidna temp]$ cpio -idv "*f1*" "*.bkp.1" < ../../lpicpio.1
f1a
f1
backup/text1.bkp.1
3 blocks
[ian@echidna temp]$ cpio -idv "*.bkp.1" < ../../lpicpio.1
cpio: backup/text1.bkp.1 not created: newer or same age version exists
backup/text1.bkp.1
3 blocks
[ian@echidna temp]$ cpio -id --no-absolute-filenames "*text1*" < ../../lpicpio.2
cpio: Removing leading `/' from member names
4 blocks
./home/ian/lpi103-2/backup/text1.bkp.1
./home/ian/lpi103-2/backup/text1.bkp.2
./home/ian/lpi103-2/text1
./backup/text1.bkp.1
[ian@echidna temp]$ cd ..
[ian@echidna lpi103-2]$ rm -rf temp # You may remove these after you have finished
|
Para obtener más detalles sobre otras opciones, vea la página man.
En su forma más sencilla, el comando dd copia un
archivo de entrada a un archivo de salida. Usted ya ha visto el comando
cp, de manera que puede preguntarse para qué otro
comando para copiar archivos. El comando dd puede hacer un
un par de cosas que el cp normal no puede. En
especial, puede realizar conversiones en el archivo, tales como convertir
minúsculas a mayúsculas o ASCII a EBCDIC. También puede "reblock" un archivo,
lo que se puede querer hacer al transferirlo a cinta. Puede saltear o
incluir sólo los bloques seleccionados de un archivo. Y finalmente, puede leer y escribir
en los dispositivos primitivos, tales como /dev/sda, que le permiten crear o restaurar un
archivo que sea una imagen completa de partición. Para escribir en los dispositivos generalmente requiere
autorización de origen.
Comenzaremos con un simple ejemplo de la conversión de un archivo a mayúsculas
utilizando la opción conv como se muestra en el Listado 37.
Usamos la opción if para especificar el archivo de entrada
en lugar de usar el valor por omisión stdin. Una opción similar
of está disponible para invalidar la salida por omisión
a stdout. A los fines informativos, hemos especificado diferentes tamaños de bloques
de entrada y salida utilizando las opciones
ibs y obs.
Para archivos grandes puede ser útil usar tamaños de bloque mayores para agilizar
las operaciones al transferir de disco a disco. De lo contrario, los tamaños de los bloques
son mayormente usados con cintas magnéticas. Observe las tres líneas de estado al final del
listado que muestran cómo muchos bloques completos y parciales fueron leídos y
escritos, y la cantidad total de datos transferidos.
Listado 37. Conversión del texto a mayúsculas usando dd
[ian@echidna lpi103-2]$ cat text6
1 apple
2 pear
3 banana
9 plum
3 banana
10 apple
1 apple
2 pear
3 banana
9 plum
3 banana
10 apple
[ian@echidna lpi103-2]$ dd if=text6 conv=ucase ibs=20 obs=30
1 APPLE
2 PEAR
3 BANANA
9 PLUM
3 BANANA
10 APPLE
1 APPLE
2 PEAR
3 BANANA
9 PLUM
3 BANANA
10 APPLE
4+1 records in
3+1 records out
98 bytes (98 B) copied, 0.00210768 s, 46.5 kB/s
|
Cualquier archivo puede ser un dispositivo primitivo. Éste será generalmente el caso para
la cinta magnética, pero una partición completa del disco, tales como /dev/hda1 o /dev/sda2,
puede ser backed up a un archivo o a una cinta. En el mejor de los casos, el sistema de archivos del dispositivo
debería ser desmontado, o por lo menos montado para lectura solamente, para asegurar que los datos no
cambien durante el backup. El Listado 39 muestra un ejemplo donde el archivo de entrada es
un dispositivo primitivo, dev/sda3, y el archivo de salida es un archivo,
backup-1, en el directorio inicial del usuario raíz. Para volcar el archivo a una cinta o a un
disquete, usted debería especificar algo como
of=/dev/fd0 o
of=/dev/st0.
Listado 38. Backup de una partición usando dd
[root@echidna ~]# dd if=/dev/sda2 of=backup-1
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 24.471 s, 32.6 MB/s
|
Observe que 797,852,160 bytes de datos fueron copiado y que un archivo de salida
es así de grande, aunque sólo alrededor del 3% de esta partición sea realmente
utilizada. Salvo que esté copiando a una cinta con la compresión de hardware,
probablemente deseará comprimir los datos. El Listado 39 muestra una forma
de lograrlo, junto con la salida de los comandos
ls y df,
los que le indican los tamaños de los archivos y el porcentaje de uso del sistema de archivos
en /dev/sda3.
Listado 39. Backup con compresión utilizando dd
[root@echidna ~]# dd if=/dev/sda2 |gzip >backup-2
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 23.4617 s, 34.0 MB/s
[root@echidna ~]# ls -l backup-[12]
-rw-r--r--. 1 root root 797852160 2009-09-25 17:13 backup-1
-rw-r--r--. 1 root root 995223 2009-09-25 17:14 backup-2
[root@echidna ~]# df -h /dev/sda2
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 755M 18M 700M 3% /grubfile
|
La compresión gzip redujo el tamaño de los archivos en alrededor de un 20% del tamaño no comprimido. Sin embargo, los bloque no utilizados podrás contener datos arbitrarios, de manera que aun el backup comprimido podrá ser mucho más grande que los datos totales de la partición.
Si divide los bytes totales copiados por el número de registros procesados
verá que dd está escribiendo bloques de datos de 512
bytes. Cuando copia a un dispositivo primitivo de salida tal como una cinta, puede dar como
resultado una operación muy ineficiente. Como mencionamos antes, especifique la opción
obs para cambiar el tamaño de la salida o la opción
ibs para especificar el tamaño del bloque de entrada.
También especifique sólo bs para definir tanto los tamaños de
los bloques de entrada como los de salida en un valor común. Al usar una cinta, recuerde usar
el mismo tamaño de bloque para leer la cinta a medida que la utilice para escribir.
Si necesita múltiples cintas u otro almacenamiento removible para guardar su backup,
necesitará dividirlo en piezas más pequeñas utilizando un utilitario tal como
split. Si necesita saltear los bloques tales como las
etiquetas de los discos o de las cintas, puede hacerlo con dd. Vea la
página man en busca de ejemplos.
El comando dd no conoce el sistema de archivos, de manera
que necesitará restaurar un vuelvo de una partición para buscar lo que hay en él.
El Listado 40 muestra cómo restaurar la partición que fue volcada en el Listado
39 a una partición, /dev/sdc7, que fue especialmente creada en una unidad removible
USB sólo con este propósito.
Listing 40. Restoring a partition using dd
[root@echidna ~]# gunzip backup-2 -c | dd of=/dev/sdc7
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 30.624 s, 26.1 MB/s
|
Es posible que esté interesado en saber que algunas aplicaciones para copiar a CD y a DVD
usan el comando dd secretamente para realizar la escritura
al dispositivo real. Si el utilitario que usar provee un registro de los comandos realmente
utilizados, usted podrá encontrarlo útil para observar el registro ahora que sabe
un poco más acerca de dd. De hecho, si copia
una imagen de ISO a un CD o DVD, una forma de verificar que no hay errores
es usar dd para leer de nuevo el disco y direccionar
el resultado a través del utilitario cmp.
El Listado 41 muestra la técnica general utilizando el archivo de backup que creamos
en este artículo en lugar de una imagen de ISO. Observe que calculamos la cantidad
de bloques que serán leídos usando el tamaño de la imagen del archivo.
Listado 41. Comparación de una imagen con un sistema de archivos.
[root@echidna ~]# ls -l backup-1
-rw-r--r--. 1 root root 797852160 2009-09-25 17:13 backup-1
[root@echidna ~]# echo $(( 797852160 / 512 )) # calculate number of 512 byte blocks
1558305
[root@echidna ~]# dd if=/dev/sdc7 bs=512 count=1558305 | cmp - backup-1
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 26.7942 s, 29.8 MB/s
|
Aprender
- Use
developerWorks roadmap for LPIC-1
para buscar los artículos sobre developerWorks a fin de ayudarlo a estudiar para obtener la certificación de LPIC-1
basándose en los objetivos de Abril de 2009.
- En el sitio
LPIC
Program
encontrará los objetivos detallados, las listas de las tareas y las consultas modelo para los
tres niveles de la certificación de administración del sistema Linux del Linux Professional Institute
En especial, vea sus objetivos de Abril de 2009
para el
LPI exam
101
y
LPI exam 102.
Remítase siempre al sitio del LPIC Program para obtener los objetivos
más recientes.
- Revise todas las
LPI
exam prep series
sobre developerWorks para conocer los fundamentos de Linux y prepararse para la certificación como
administrador de sistemas basándose en los objetivos de un examen LPI anterior previo a
Abril de 2009.
- En
"Basic
tasks for new Linux developers"
(developerWorks, Marzo de 2005), aprenderá cómo abrir la ventana de una o la indicación de shell
y mucho más.
- El
Linux Documentation Project tiene una
variedad de documentos útiles, especialmente su HOWTOs.
- In the
developerWorks Linux zone,
busque más recursos para los desarrolladores de Linux y realice un escaneo de nuestros
most popular articles and
tutorials.
- Vea todos los
Linux tips
y los
Linux tutorials
sobre developerWorks.
- Manténgase actualizado con los
developerWorks technical events and Webcasts.
Obtener los productos y tecnologías
- Con
IBM trial software,
disponible para ser descargado directamente de developerWorks, cree su próximo
proyecto de desarrollo en Linux.
Comentar
- Participar en el foro de debate.
- Participe en la
My developerWorks community;
con su perfil personal y su página inicial, usted puede adaptar
developerWorks de acuerdo con sus intereses e interactuar con otros usuarios de
developerWorks.
Ian Shields trabaja en múltiples proyectos Linux para la zona Linux de developerWorks. Es Senior Programmer de IBM en el Research Triangle Park (RTP), Carolina del Norte. Ingresó a IBM en Canberra, Australia, como Systems Engineer en 1973, y desde entonces se dedica a sistemas de comunicaciones y computación ubicua en Montreal, Canadá, y en el RTP de Carolina del Norte. Es propietario de numerosas patentes y publicó diversos trabajos. Tiene una diplomatura en Matemática Pura y Filosofía de la Universidad Nacional de Australia. Es Máster y Doctor en Ciencias de la Computación de la Universidad Estatal de Carolina del Norte. Para contactar a Ian, escríbale a: ishields@us.ibm.com.