1.4: Trabajar con archivos y directorios
- Page ID
- 55181
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Ahora que sabemos cómo ubicar archivos y directorios en el sistema de archivos, aprendamos un puñado de herramientas importantes para trabajar con ellos y el sistema en general.
Visualización del contenido de un archivo (de texto)
Si bien existen muchas herramientas para ver y editar archivos de texto, una de las más eficientes para visualizarlos se llama less
, que toma como parámetro una ruta al archivo a ver, que por supuesto puede ser solo un nombre de archivo en el directorio de trabajo actual (que es un tipo de ruta relativa). [1]

La invocación de menos
en el archivo p450s.fasta
abre una “ventana interactiva” dentro de la ventana del terminal, en donde podemos desplazarnos hacia arriba y hacia abajo (e izquierda y derecha) en el archivo con las teclas de flecha. (Como de costumbre, el mouse no es muy útil en la línea de comandos.) También podemos buscar un patrón escribiendo/
y luego escribiendo el patrón antes de presionar Enter.

Cuando termine con menos
, al presionar q
saldrá y devolverá el control al shell o línea de comandos. Muchos de los formatos de texto utilizados en biología computacional incluyen líneas largas; por defecto, menos
envolverá estas líneas alrededor del terminal para que puedan verse en su totalidad. El uso de menos -S
se apagará este ajuste de línea, lo que nos permite ver el archivo sin ningún reformateo. Así es como se ve el archivo anterior cuando se ve con menos -S p450s.fasta
:

Observe que la primera línea larga no ha sido envuelta, aunque todavía podemos usar las teclas de flecha para desplazarse hacia la izquierda o hacia la derecha para ver el resto de esta línea.
Creación de nuevos directorios
El comando mkdir
crea un nuevo directorio (a menos que ya exista un archivo o directorio del mismo nombre), y toma como parámetro la ruta al directorio a crear. Este suele ser un nombre de archivo simple como ruta relativa dentro del directorio de trabajo actual.

Mover o cambiar el nombre de un archivo o directorio
La utilidad mv
sirve tanto para mover como renombrar archivos y directorios. El uso más simple funciona como mv
<source_path><destination_path>, donde <source_path>está la ruta (absoluta o relativa) del archivo/directorio a renombrar, y
<destination_path>es el nuevo nombre o ubicación para darle.
En este ejemplo, cambiaremos el nombre de p450s.fasta
a p450s.fa
, lo moveremos a la carpeta projects
y luego renombraremos la carpeta projects
a projects_dir
.

Debido a que mv
cumple un doble papel, es importante recordar la semántica:
- Si
<destination_path>no existe, se crea (siempre y cuando existan todas las carpetas contenedoras).
- Si
<destination_path>existe:
- Si
<destination_path>es un directorio, la fuente se mueve dentro de esa ubicación.
- Si
<destination_path>es un archivo, ese archivo se sobrescribe con la fuente.
- Si
Dicho de otra manera, mv
intenta adivinar qué debe hacer, sobre la base de si el destino ya existe. Deshagamos rápidamente los movimientos anteriores:

Algunas otras notas: Primero, al especificar una ruta que es un directorio, el final/
es opcional: mv projects_dir/ projects
es lo mismo que mv projects_dir projects
si projects_dir
es un directorio (de manera similar, los proyectos
podrían haberse especificado como proyectos/
). Segundo, es posible mover múltiples archivos al mismo directorio, por ejemplo, con proyectos mv p450s.fasta todo_list.txt
. Tercero, es bastante común ver.
refiriéndose al presente directorio de trabajo como destino, como en mv.. /file.txt.
por ejemplo, que movería file.txt
del directorio anterior al directorio de trabajo actual (..
) en el directorio de trabajo actual (.
, o “aquí”).
Copiar un Archivo o Directorio
Copiar archivos y directorios es similar a moverlos, excepto que el original no se elimina como parte de la operación. El comando para copiar es cp
, y la sintaxis es cp
<source_path><destination_path>. Hay una advertencia, sin embargo: cp
no copiará un directorio completo y todo su contenido a menos que agregue la bandera -r
al comando para indicar que la operación debe ser recursiva.

Olvidar el -r
al intentar copiar un directorio da como resultado una advertencia de omisión del directorio
.
Es posible copiar y mover simultáneamente (y eliminar, etc.) muchos archivos especificando múltiples fuentes. Por ejemplo, en lugar de cp.. /todo_list.txt.
, podríamos haber copiado tanto la lista de tareas pendientes como el archivo p450s.fasta
con el mismo comando:
Eliminar (Eliminar) un Archivo o Directorio
Los archivos se pueden eliminar con el comando rm
, como en rm
<target_file>. Si deseas eliminar un directorio completo y todo lo que hay dentro, necesitas especificar el indicador -r
para recursivo, como en rm -r
<target_dir>. Dependiendo de la configuración de su sistema, es posible que se le pregunte “¿está seguro?” para cada expediente, al que se puede responder con una y
. Para evitar esta comprobación, también puede especificar el indicador -f
(force), como en rm -r -f
<target_dir>o rm -rf
<target_dir>. Vamos a crear un directorio temporal junto con las copias de archivo desde arriba, dentro de la carpeta projects, y luego eliminar el archivo p450s.fasta
y el archivo todo_list.txt
así como la carpeta temporal.
¡Cuidado! Los archivos borrados se han ido para siempre. No hay deshacer, y no hay papelera de reciclaje. Siempre que use el comando rm
, vuelva a verificar su sintaxis. Hay un mundo de diferencia entre rm -rf project_copy
(que elimina la carpeta project_copy
) y rm -rf project _copy
(que elimina las carpetas project
y _copy
, si existen).
Comprobación del tamaño de un archivo o directorio
Aunque ls -lh
puede mostrar los tamaños de los archivos, este comando no resumirá cuánto espacio en disco ocupa un directorio y todo su contenido. Para conocer esta información, existe el comando du
(uso de disco), que casi siempre se combina con las opciones -s
(resumen) y -h
(mostrar tamaños en formato legible por humanos).
Como siempre,.
es un objetivo útil, aquí ayudando a determinar el espacio de archivos utilizado por el directorio de trabajo actual.
Edición de un archivo (de texto)
No faltan editores de texto de línea de comandos, y aunque algunos de ellos, como vi
y emacs
, son poderosos y pueden mejorar la productividad a largo plazo, también tardan un tiempo razonable en familiarizarse con ellos. (Se han escrito libros completos sobre cada uno de estos editores.)
Mientras tanto, un simple editor de texto disponible en la mayoría de los sistemas es nano
; para ejecutarlo, simplemente especificamos un nombre de archivo para editar:

Si el archivo no existe ya, se creará cuando se guarde por primera vez, o “escrito”. El nano
editor abre una ventana interactiva como mucho menos
, pero el contenido del archivo se puede cambiar. Cuando termine, la secuencia de teclas Control-O
guardará las ediciones actuales en el archivo especificado (tendrá que presionar Enter para confirmar), y luego Control-X
saldrá y devolverá el control al símbolo del sistema. Esta información incluso se presenta en un pequeño menú de ayuda en la parte inferior.

Aunque nano
no es tan sofisticado como vi
o emacs
, sí admite una serie de características, incluyendo la edición de múltiples archivos, cortar/copiar/pegar, buscar y reemplazar por patrón y resaltado de sintaxis de archivos de código.
Los archivos de código son los tipos de archivos que solemos querer editar con nano
, en lugar de ensayos o cuentos cortos. Por defecto, en la mayoría de los sistemas, nano
automáticamente “envuelve” líneas largas (es decir, presiona automáticamente Enter) si serían más largas que el ancho de la pantalla. Desafortunadamente, ¡esta característica causaría un error para la mayoría de las líneas de código! Para desactivarlo, nano se puede iniciar con la bandera -w
, como en nano -w todo_list.txt
.
Eficiencia de la línea de comandos
Si bien el shell proporciona una interfaz poderosa para la computación, ciertamente es cierto que la gran dependencia de la escritura puede ser tediosa y propensa a errores. Afortunadamente, la mayoría de los shells proporcionan una serie de características que reducen drásticamente la cantidad de escritura necesaria.
Primero, caracteres comodín como *
(que coincide con cualquier número de caracteres arbitrarios) y?
(que coincide con cualquier carácter arbitrario) nos permiten referirnos a un grupo de archivos. Supongamos que queremos mover tres archivos que terminan en .temp
a un directorio temp
. Podríamos ejecutar mv
listando los archivos individualmente:

Alternativamente, podríamos usar el archivo mv *.temp
; el shell expandirá archivo*.temp
a la lista de archivos especificados anteriormente antes de pasar la lista expandida a mv
. [2]

Del mismo modo, podríamos mover solo Filea.temp
y Fileb.temp
(pero no FileAA.temp
) usando el archivo mv?. tmp temp
, porque el?
comodín sólo coincidirá con uno de cualquier carácter. Estos comodines se pueden usar en cualquier lugar de una ruta absoluta o relativa, y se pueden usar más de uno en una sola ruta. Por ejemplo, ls /home/ */*.txt
inspeccionará todos los archivos que terminan en .txt
en todos los directorios de inicio de los usuarios (si son accesibles para su lectura).
Segundo, si desea volver a ejecutar un comando, o ejecutar un comando similar a un comando ejecutado anteriormente, puede acceder al historial de comandos presionando la flecha hacia arriba. Una vez que hayas identificado qué comando quieres ejecutar o modificar, puedes modificarlo usando las flechas izquierda y derecha, retroceder o eliminar, y luego escribir y presionar Enter nuevamente cuando estés listo para ejecutar el comando modificado. (Ni siquiera necesitas tener el cursor al final de la línea para presionar Enter y ejecutar el comando). Para una sesión de inicio de sesión determinada, puede ver parte de su historial de comandos ejecutando el comando history
.
Finalmente, una de las mejores formas de navegar por el shell y el sistema de archivos es mediante el uso de la terminación de tabulación. Al escribir una ruta (ya sea absoluta o relativa), nombre de archivo o directorio, o incluso un nombre de programa, puede presionar Tab, y el shell autocompletará la parte de la ruta o comando, hasta que el autocompletado se vuelva ambiguo. Cuando las opciones son ambiguas, el shell te presentará las diversas opciones coincidentes para que puedas inspeccionarlas y seguir escribiendo. (Si quieres ver todas las opciones aunque no hayas comenzado a escribir la siguiente parte de una ruta, puedes presionar rápidamente Tab dos veces). Puedes presionar Tab tantas veces como quieras mientras ingresas un comando. ¡Los usuarios expertos de la línea de comandos usan la tecla Tab muchas veces al minuto!
Cómo obtener ayuda en un comando o programa
Aunque hemos discutido algunas de las opciones (también conocidas como argumentos, o banderas) para programas como ls
, cp
, nano
y otros, hay muchas más sobre las que podrías desear aprender. La mayoría de estos comandos básicos vienen con “páginas man”, abreviatura de “páginas de manual”, a las que se puede acceder con el comando man
.

Este comando abre una página de ayuda para el comando en cuestión (generalmente en menos
o un programa similar al mismo), mostrando los diversos parámetros y banderas y lo que hacen, así como una variedad de otra información como comandos y ejemplos relacionados. Para algunos comandos, también hay páginas de “info”; intenta ejecutar info ls
para leer una descripción más completa de ls
. De cualquier manera, como en menos
, al presionar q
saldrá de la página de ayuda y volverá al símbolo del sistema.
Visualización de los mejores programas en ejecución
La utilidad superior
es invaluable para verificar qué programas están consumiendo recursos en una máquina; muestra en una ventana interactiva los diversos procesos (programas en ejecución) ordenados por el porcentaje de tiempo de CPU que están consumiendo, así como qué usuario los está ejecutando y cuánta RAM están consumiendo . Running Top
produce una ventana como esta:

Desde la perspectiva de los usuarios, la lista de procesos por debajo de la línea oscura es más útil. En este ejemplo, ningún proceso está utilizando actualmente una cantidad significativa de CPU o memoria (y aquellos procesos que se están ejecutando son propiedad de la raíz
del administrador). Pero si algún usuario estuviera ejecutando procesos que requirieran más de un poquito de CPU, probablemente se mostrarían. Para ordenar en su lugar por uso de RAM, use la secuencia de teclas Control-M
. Cuando termine, q saldrá
de la parte superior
y le devolverá al símbolo del sistema.
De particular importancia son las columnas %CPU
y %MEM
. El primero puede variar de 0 hasta 100 (por ciento) veces el número de núcleos de CPU en el sistema; así un valor de 3200
indicaría un programa que utiliza 100% de 32 núcleos de CPU (o quizás 50% de 64 núcleos). La columna %MEM
oscila entre 0 y 100 (por ciento). Generalmente es algo malo para el sistema cuando la memoria total utilizada por todos los procesos es cercana o superior al 100%, esto indica que el sistema no tiene suficiente “memoria de trabajo” y puede estar intentando usar el disco duro mucho más lento como memoria de trabajo. Esta situación se conoce como intercambio, y la computadora puede funcionar tan lentamente como para haberse estrellado efectivamente.
Programas para matar a los pícaros
A veces sucede que los programas que deberían ejecutarse rápidamente, no lo hacen Quizás estén en un estado de error interno, haciendo un ciclo para siempre, o quizás la tarea de análisis de datos que había estimado que tardaría uno o dos minutos está tardando mucho más. Hasta que finalice el programa, el símbolo del sistema será inaccesible.
Hay dos formas de detener este tipo de programas en ejecución: la “suave” y la “dura”. La forma suave consiste en intentar ejecutar la combinación de teclas Control-C
, que envía una señal de parada al proceso en ejecución para que termine.
Pero si el programa pícaro se encuentra en un estado de error particularmente malo, no se detendrá ni siquiera con un Control-C
, y es necesaria una matanza “dura”. Para ello se requiere iniciar sesión en la misma máquina con otra ventana de terminal para recuperar algún acceso a la línea de comandos. Ejecute la parte superior
y anote el PID
(ID de proceso) del proceso infractor. Si no lo ves en la ventana superior
, también puedes intentar ejecutar ps augx
, que imprime una tabla de todos los procesos en ejecución. Supongamos que el PID para que el proceso mate es 24516
; matar este proceso se puede hacer ejecutando kill -9 24156
. La opción -9
especifica que el sistema operativo debe detener el proceso en su camino y limpiar inmediatamente los recursos utilizados por él. Los procesos que no se detienen a través de un kill -9
son raros (aunque no se puede eliminar
un proceso que ejecuta otro usuario) y probablemente requieran un reinicio de la máquina o la intervención del administrador.
Ejercicios
- Crea los siguientes directorios dentro de tu directorio home, si aún no los tienes:
descargas
,locales
yproyectos
. Dentro delocal
, cree un directorio llamadobin
. Estas carpetas son un conjunto común y útil para tener en tu directorio de inicio; las usaremos en futuros capítulos para trabajar, descargar archivos e instalar software en. - Abra no una sino dos ventanas de inicio de sesión, e inicie sesión en una máquina remota en cada una. Esto le da dos directorios de trabajo presentes, uno en cada ventana. Puedes usar uno para trabajar y otro para tomar notas, editar archivos o ver la salida de
top
.Crea un directorio oculto dentro de tu directorio principal llamado
.hidden
. Dentro de este directorio, cree un archivo llamadonotas
. Edita el archivo para que contenga trucos e información que temes que puedas olvidar. [3] - Dedique unos minutos a practicar la finalización de pestañas mientras se mueve por el sistema de archivos usando rutas absolutas y relativas. Moverse de manera eficiente a través de la finalización de pestañas es una habilidad sorprendentemente necesaria.
Deshojee
la página de manual parals
, y pruebe algunas de las opciones enumeradas allí. Lee un poco de la página deinformación
paranano
.
- Hay un programa similar llamado
más
, originalmente diseñado para mostrar “más” de un archivo. El programamenos
se desarrolló como una alternativa más completa amás
, y se llamó así porque “menos es más”. - Esto es importante tener en cuenta al combinar
rm
con comodines; ¡los comandosrm -rf *.temp
yrm -rf * .temp
son muy diferentes! Este último eliminará todos los archivos del directorio actual, mientras que el primero solo eliminará aquellos que terminen en.temp
. - También podrías considerar llevar un cuaderno de papel, o algo en un Wiki u otro documento de texto. Si prefieres conservar notas digitales, intenta usar un editor de texto simple como
nano
, TextEdit en OS X o Notepad en Windows. Los editores de texto rico como Microsoft Word a menudo reemplazan automáticamente cosas como los caracteres de comillas simples con comillas con serif, que no funcionan en la línea de comandos, lo que lleva a dolores de cabeza.