Aprendiendo de las anécdotas

Bar Ostadar, Donostia. Comida/Reunión para planificar algunos aspectos de la migración de BabeliumProject a HTML5. Comprobemos a ver si tenemos acceso a la señal wifi Eduroam (las facultades quedan muy cerquita). Ooops… la primera red Wifi tiene un nombre muuuuuy curioso 🙂 ¿Le sacamos un pantallazo? Mmmhh… si pulso ImprPant se esfuma el menú del NetworkManager. ¿Cómo lo hago? Si tuviéramos Shutter instalado, it would be a piece of cake! 🙂 Pero no lo tenemos… entonces, ¿cómo? Abrimos una terminal y tecleamos:

$ sleep 5 && xwd -root > salida

La idea es esperar 5 segundos (tiempo más que suficiente para que con el ratón abramos el menú del Network Manager y lo dejemos a la vista mostrando los nombres de las redes). A los 5 segundos el comando xwd sacará un pantallazo a pantalla completa. El fichero salida es una imagen raw que podemos editar con Gimp.

¿Cuál era el nombre de red que ha provocado todo esto? Échale un vistazo al pantallazo adjunto 🙂

Sustituir los saltos de línea Win por saltos Linux

¿Son todos los saltos de línea iguales?  No señor !  Hay saltos y saltos 🙂  Por ejemplo, los siguientes son saltos típicos de un editor de textos Windows:

Los ^M que aparecen en la imagen son realmente la representación visual de «rn» (carriage return + line feed), es decir, el salto de línea típico de Windows. Un fichero en PHP con esos saltos de línea se pueden ejecutar sin problemas en Linux. Pero cuando los editamos con el Vim (o $EDITOR de confianza), la verdad es que los ^M dan grima. Esto ocurre porque en Linux el salto de línea se representa como n , a secas (sin el r ).  Podemos convertir un fichero con saltos Win a otro con saltos Linux con el comando sed:

sed 's/^M$//' fichero

O bien, si no nos acordamos del conjuro, seguro que nos viene a la memoria el mnemotécnico «fromdos» (de MSDOS a Unix):

  fromdos fichero

que automágicamente detecta y convierte (de MSDOS a Unix o viceversa) el fichero pasado como parámetro. fromdos es un comando del paquete tofrodos.

Así que sabes copiar archivos, ¿eh?

Update 25/02/2011: las respuestas que habéis enviado son correctas. Explicaré entre líneas lo que hacen los distintos comandos (pulsa sobre More>>).

¿Estás seguro? Sí, es una operación básica, pero sin que os ponga la solución en este post (lo dejo para el siguiente), ¿sabrías decirme con absoluta certeza qué hacen cada uno de estos comandos cp? ¿ y el mkdir o touch del ejercicio 0? No te mientas 😉

0.

mkdir -p /tmp/tests/{d1,d2}
cd /tmp/tests
 touch d1/{.oculto,a,b}

[hide-this-part]
Crea dos directorios, d1 y d2 dentro de tests. Si tests no existiera, la opción -p fuerza su creación.
Con touch, creamos 3 archivos (.oculto, a y b) dentro de d1
[/hide-this-part]

1.

cp d1/* d2/

Pista: ¿se han copiado TODOS los archivos o sólo 2 de ellos?

[hide-this-part]
Sólo 2 de los archivos han sido copiados. El * en cp NO funciona exactamente como una expresión regular (si así fuera, un * abarcaría cualquier cosa, incluyendo nombres de archivos que empiecen por punto). Pero no, el * casa con cualquier nombre de archivo que no sea uno oculto. También casaría con un archivo de nombre c.d por ejemplo
[/hide-this-part]

Reseteamos (Borramos el contenido de /tmp/tests y desde ese mismo directorio ejecutamos 0 de nuevo…)

2.

cp d1/ d2/

Pista: ¿se ha copiado algo?

[hide-this-part]
No se copia nada. Hay que especificar qué es lo que se quiere copiar de d1 en d2. No se debe a que ya exista d2… puedes probar con cp d1/ d3/ y ocurrirá lo mismo. Ídem si lo pruebas sin la / del final.
[/hide-this-part]

Reseteamos

3.

cp d1/*.* d2

Pista: ¿se ha copiado algo?
[hide-this-part]
No se copia nada. El * no puede ser sustituído por el conjunto vacío en las órdenes copy. Si así fuera (si se pudiera sustituir por el conjunto vacío, el archivo .oculto sí que se hubiera copiado). Ojo! Si en d1 tuviéramos un archivo de nombre c.d, entonces los comodines sí que casarían con dicho archivo y sería copiado.
[/hide-this-part]

Reseteamos

4.

cp d1/. d2

Pista: ¿se ha copiado algo?

[hide-this-part]
No copia nada pues la orden es equivalente a la dada en el ejercicio 2.
[/hide-this-part]

Reseteamos

5.

cp -R d1/. d2

Pista: vaya… si no hay subdirectorios, para qué habré usado el flag -R };-)

[hide-this-part]
¡Por fin! Esta orden sí que copia TODO el contenido de d1 en d2 (archivos ocultos incluídos). Si hubiera subcarpetas, también las copiaría. ¡Ojo_1! -R -r –recursive son equivalentes. ¡Ojo_2! No hay subdirectorios, pero aún así hemos usado -R para copiar de forma recursiva. ¡Ojo_3! No es lo mismo el ejercicio 5 que el ejercicio siguiente: cp -R d1/ d2/ (esto último copiaría dentro de d2 el directorio d1 – incluído el propio nombre d1 – )
[/hide-this-part]

Anti bomba tar.gz

¿A quién no le ha ocurrido? Descargas un fichero.tar.gz en $HOME, invocas el conjuro para desempaquetar y descomprimir:

$ tar -xvzf fichero.tar.gz

Y cuando observas el resultado te das cuenta que el muy %$E/&% se ha descomprimido SIN crear un subdirectorio, o sea, ha dejado todo tu $HOME lleno de ficheros. Es lo que se conoce como una bomba tar.

Bien, el siguiente comando atb (anti-tar-bomb), encontrado en commandlinefu.com, analiza el tar.gz (o .bz2 o .tgz) ANTES de descomprimirlo. Si resulta que se trata de una bomba tar, crea un directorio con el mismo nombre X que el fichero X.tar.gz y luego lo descomprime en X. Magia!

atb() {shopt -s extglob ; l=$(tar tf $1); if [ $(echo "$l" | wc -l) -eq $(echo "$l" | grep $(echo "$l" | head -n1) | wc -l) ]; then tar xf $1; else mkdir ${1%.t@(ar.gz|ar.bz2|gz|bz|ar)} && tar xf $1 -C ${1%.t@(ar.gz|ar.bz2|gz|bz|ar)}; fi ; shopt -u extglob}

Backup-remoto con autolimitación de ancho de banda

El siguiente comando, de una única línea parece que hiciera magia:

 tar -cj /backup | cstream -t 777k | ssh host 'tar -xj -C /backup'

Explicación:

tar -cj : (j) comprime con bzip el directorio backup, (c) y lo empaqueta en un único archivo
cstream -t 777k : limita la transferencia del contenido que le llega (el archivo empaquetado) a 777 kbps
ssh host ‘tar -xj -C /backup’ : se conecta por ssh al host destino y desempaqueta+descomprime el archivo bzip de backup que le llega en un directorio con el mismo nombre.

cstream es una joya que acabo de descubrir, al igual que el comando que he explicado, gracias a la excelente base de datos de comandos para administradores Linux que es commandlinefu.com