Linux

Command line tricks

SOME TIPS TO DO USEFUL TRICKS

These programs, scripts and commands have been tested on Ubuntu/Debian distributions of Linux. Feel free to contact me at fgonzalez[at]lpmd.cl

MANIPULATING TEXT FILES/DATA

MANIPULATING PHOTOS/VIDEOS/PDF

INTERNET

OPERATIVE SYSTEM

GNUPLOT


MANIPULATING TEXT FILES/DATA

October 29, 2015

FINDING FILES

  • To find a file by its name, from the current directory (.), we use
 find . -iname "archivo"
The option -iname ignores differences between lower and upper case.
  • We can find a file by its extension, for example, all .pdf files:
find . -iname "*.pdf"
  • We can look for files and words inside them. For example, to find all .cc files (C++ sources) in the folder Programs/, and show only those that contain the word cmath, we excecute
find Programs/ -iname "*.cc" -exec grep "cmath" {} +
  • Find only files (exclude folders) that were modified on December in the folder "~/examples"
find ~/examples/ -type f -exec ls -ltr {} + | grep "Dec"
  • We can use 'find' to check that each file of a certain directory is identical to another one, with the same name, in another directory:
find directory1/ -type f -exec diff -q  {} directory2/{}  \;

When using -exec in find, the symbol {} represents the file that was found in the search.

November 29, 2010

SEARCHING INSIDE FILES

To find words or a chain of characters inside a text file (like "words.txt"), we use the grep command. For example, to find all lines in the file that start with any uppercase, type

 grep '^[A-Z]' words.txt

If we are looking for any line that starts with uppercase o any digit, we can do it by

 grep '^[A-Z1-9]' words.txt

Looking for lines that end in lowercase:

 grep '[a-z]$' words.txt

Looking for a particular word, like "apple" in the file "words.txt":

 grep 'apple' words.txt

This will look for the sequence of characters "apple" contained inside any word in the text (results may include 'apple15', 'myappleFRUIT', 'this apple'). Conversly, if we want all the lines in which "apple" DOES NOT APPEAR, we use

 grep -v 'apple' words.txt

PD: I recommend adding the follwing line in your ".bashrc" (LINUX) / ".bash_profile" (MacOS X):

 alias grep='grep --color=auto'

This alias will turn on the colors on your command line when using grep.


MANIPULATING PHOTOS/VIDEOS/PDF

MANIPULATING PHOTOS/VIDEOS/PDF

January 23, 2016

REDUCE THE FILE SIZE OF A PDF

If we want to save space in the hard drive, we can make a PDF lighter, looking exactly the same, but using less resolution. We can do it using the program Ghostscript (gs):

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=reduced-pdf.pdf original-file.pdf

If the pdf is made up by pictures only (see Merge/join many PDF files (or images) in a single PDF below), we can combine pdfimages (to extract the images) with convert (to reduce the size of the images), and then merge all together using pdftk and sam2p. It is basically a mix of what we show in the tricks below:

#!/bin/bash

# The PDF file is an argument of the program
for myPDF in "$1" #*.pdf
do
 folder=$(echo $myPDF|sed -e 's/.pdf//')
 mkdir -p "$folder"
 cd "$folder"
  cp ../"$myPDF" .
  pdfimages -j "$myPDF" myimages
  for i in myimages*ppm; do convert -geometry 800 "$i" "$i".jpg; done
  for f in myimages*.jpg;do sam2p -j:quiet "$f" PDF: "$f".pdf ; done
  rm "$myPDF" myimages*ppm myimages*jpg
  pdftk myimages*.pdf cat output newfile.pdf
  rm myimages*pdf

  pages_new=$(pdfinfo newfile.pdf | grep Pages|awk '{print $2}')
  pages_old=$(pdfinfo "../$myPDF" | grep Pages|awk '{print $2}')
  size_new=$(pdfinfo newfile.pdf | grep "File size"|awk '{print $3}')
  size_old=$(pdfinfo "../$myPDF" | grep "File size"|awk '{print $3}')
  if [ $pages_new == $pages_old ]; then
#   echo "They have" $pages_new "pages both"
   if [ $size_new -lt $size_old ]; then
    #echo "The new one is lighter:" $size_new "vs antiguos" $size_old
    echo "The new $myPDF is lighter."
    mv newfile.pdf "../$(echo $myPDF|sed -e 's/.pdf/_v2.pdf/')"
   else
    echo "The new $myPDF is heavier than before. Reducction did not work. Erasing new one..."
    rm newfile.pdf
   fi
  else
   echo "WARNING: the amount pages is not the same"
  fi
 cd ..
 rmdir "$folder"
done

2 de Diciembre, 2015

CREAR GIF A PARTIR DE UN VIDEO

Si tenemos un video y queremos crear una animación gif, podemos utilizar el programa mplayer:

mplayer -ao null <video file name> -vo jpeg:outdir=output

Esto dividirá el video en varias fotos en formato jpeg, colocándolas en la carpeta output/. Luego, usando el programa convert, ejecutamos

convert output/* output.gif

Podemos optimizar el archivo (reducir su peso), usando nuevamente el programa convert:

convert output.gif -fuzz 75% -layers Optimize optimised.gif

Mientras mayor sea el valor de fuzz, más liviano queda el archivo.

30 de Octubre, 2015

ESCALAR IMÁGENES O FOTOS

Supongamos que tenemos una carpeta con fotografías en formato jpg, sacadas con una cámara digital. Si las fotos se sacaron con mucha resolución, van a ser muy pesadas, por lo que será difícil enviarlas por email, o bien estarán ocupando demasiado espacio de disco duro. Para reducir todas las fotos de tamaño con un solo comando, ejecutamos en dicha carpeta

 mkdir nuevas; ls -1 *.jpg | sed 's/.*/convert -geometry 1024x768 & nuevas\/&/' | sh

Esto crea una carpeta llamada "nuevas" dentro de la carpeta en cuestión, y en ella introducen las nuevas fotos escaladas a un tamaño 1024x768, que suele ser el tamaño standard de las fotos buenas, sin ser muy pesadas (~300Kb).

  • Es posible además poner un prefijo a los nombres de las fotos, añadiéndolo delante del símbolo "&". Por ejemplo, cambiando "&" por "s_&" provocará que una foto de origen, llamada foto.jpg, quede escalada en la carpeta "nuevas" con el nombre "s_foto.jpg".
  • Si no quieres crear una carpeta nueva dentro de la carpeta contenedora de fotos, sino que quieres dejar las fotos escaladas dentro de la misma carpeta; pero con distinto nombre, ejecuta
 ls -1 *.jpg | sed 's/.*/convert -geometry 1024x768 & .\/s_&/' | sh

lo cual creará las nuevas fotos escaladas, con el prefijo "s_" para identificarla de las originales.

30 de Octubre, 2015

SEPARAR UN PDF EN VARIAS FOTOS

Para extraer todas las fotos de un archivo PDF en formato JPG, podemos usar el programa pdfimages:

pdfimages -j myfile.pdf myimages

En el caso de que la opción -j no sea capaz de convertir las fotos en formato JPG, dejándolas en formato PPM (suele suceder), podemos convertirlas usando el programa convert:

for i in *ppm; do convert -geometry 800 "$i" "$i".jpg; done

La opción -geometry 800 escala la imágen a 800 pixeles de ANCHO, ajustando el alto para mantener las proporciones. También podemos usar

for i in *ppm; do convert -geometry x800 "$i" "$i".jpg; done

Con -geometry x800, se escala la imágen hasta tener 800 pixeles de ALTO, ajustando el ancho para mantener las proporciones.

10 de Junio, 2013

JUNTAR VARIOS PDF (O FOTOS) EN UN SOLO PDF

Si tienes muchos archivos en formato jpg, y quieres crear un solo documento pdf con ellos, esta es una forma de hacerlo. Necesitas tener instalados los programas sam2p y pdftk:

sudo apt-get install sam2p pdftk

Ahora convierte los archivos jpg en archivos pdf:

for f in *.jpg;do  sam2p "$f" PDF: "$f".pdf ; done

Con el siguiente comando, juntamos los archivos pdf recien creados (*.pdf) en un único archivo, llamado newfile.pdf:

pdftk *.pdf cat output newfile.pdf

Todo en un solo programa

En base a estos comandos, hice un programa que, ejecutado dentro de una carpeta con fotos, crea un pdf un directorio más arriba (donde se encuentra la carpeta):

#!/bin/bash

for i in */
do
 if [ -f "$i" ]; then cd "$i"; fi
 # Gathering PNG pics
 if [ "$(find . -maxdepth 1 -iname "*png"|wc -l)" -gt "0" ]; then
  echo -n "Formato png en "
  pwd
  for f in *.png;  do   sam2p -j:quiet "$f" PDF: "$f".pdf;  done
  pdftk *.pdf cat output newfile.pdf
  rm *png.pdf
 # Gathering JPG pics
 elif [ "$(find . -maxdepth 1 -iname "*jpg"|wc -l)" -gt "0" ]; then
  echo -n "Formato jpg en";  pwd
  for f in *.jpg;  do   sam2p -j:quiet "$f" PDF: "$f".pdf;  done
  pdftk *.pdf cat output newfile.pdf
  rm *jpg.pdf
 else
  echo -n "Ninguna foto jpg o png encontrada en"; pwd
 fi

 new="../$(basename "$PWD").pdf"
 if [ -f newfile.pdf ]; then
  mv newfile.pdf "$new"
  echo "$(basename "$PWD").pdf created successfully."
 fi
 if [ -f "$i" ]; then cd ..; fi
done

29 de Noviembre, 2010

MENCODER: Manipulando videos

Primero, descarga el programa mencoder:

 sudo apt-get install mencoder

CONVERTIR FORMATO DE VIDEO

Para simplemente cambiar el formato de un video, por ejemplo, de ogv a avi, utiliza el comando

 mencoder pelicula.ogv -ovc copy -oac copy -o pelicula.avi

En este caso, el codec de video es simplemente copy, para que copie el video y el audio sin cambiar nada más que el formato.

SUBTITULAR PELÍCULAS

En este caso, debes cambiar el codec de video por lavc y estar en posesión (descargar) los subtítulos en formato srt. Luego los pegas al video usando el comando

 mencoder pelicula.avi -sub subtitulos.srt -ovc lavc -oac copy -o pelicula-sub.avi


INTERNET

29 de Noviembre, 2010

SCP: Copiar archivos de un computador a otro

Entre dos computadores (con linux) conectados a la misma red:

Supongamos que estás en tu casa, oficina o cualquier lugar en donde tengan internet, y todos están conectados al mismo router, switch, etc (están todos en la misma red local).

Si estas usando tu laptop, y quieres copiar un archivo al pc de escritorio, averigua el IP del PC de escritorio. Si este tiene linux, en la terminal de ese PC ejecutas

ifconfig

Si el computador está conectado por cable, el IP aparecerá en eth0. Si está conectado por WiFi, estará en wlan0. Será algo como 192.168.1.2. Si el archivo que quieres copiar se llama file.txt y está en tu laptop con linux, y quieres copiarlo a este PC de escritorio que tiene ese IP, ejecuta

 scp file.txt casa@192.168.1.2:

En este comando, el primer argumento de scp es el archivo de origen que se encuentra en tu laptop, y el segundo, el lugar de destino, donde casa es el nombre del usuario y 192.168.1.2 es el IP interno. Este número IP lo puedes conseguir dando ifconfig (saldrá en donde dice wlan0 si estás conectado por red inalámbrica, o en eth0 si estás conectado por red cableada).

Si estas usando tu laptop, y quieres copiar en este un archivo que está en el pc escritorio, digamos file2.txt, da el comando

 scp casa@192.168.2.5:/home/casa/file2.txt .

Esto copia el archivo file2.txt, que se encuentra en el directorio /home/casa/file2.txt del pc en el directorio del laptop desde el cual diste el comando (el punto "." significa "copiar aqui"). Puedes reemplazar el punto por cualquier otro directorio en el laptop que desees.

Si estás en el pc de escritorio y quieres copiar algo al laptop, la filosofía es la misma:

 scp file2.txt laptopUSR@192.168.1.5:

En este caso, el IP del laptop es distinto (y el usuario, en general, también) y puedes obtenerlo con ifconfig como antes. Este comando copia file2.txt desde el pc al home del usuario laptopUSR en el laptop. Puedes especificar el directorio de llegada en el caso de que no quieras copiarlo en el home:

 scp file2.txt laptopUSR@192.168.1.5:/home/laptopUSR/carpeta/subcarpeta/

Si estás en el pc de escritorio y quieres sacar algo del laptop, entonces digita

 scp laptopUSR@192.168.1.5:/home/laptopUSR/file.txt .

Dejar copiando con nohup (se puede cerrar sesión)

Si un archivo es muy grande o la conexión es muy lenta, la transferencia de archivos puede demorar mucho, a veces más del tiempo que tenemos disponible frente a la computadora. Para poder dejar scp ejecutándose en el background, y así poder cerrar la sesión, debemos dar el siguiente comando:

 nohup scp -r -p usr@192.168.1.5:Folder/subfolder/  .  > nohup.out  2>&1

En este caso, estamos trayendo la carpeta subfolder/ completa (con la opción -r, y conservando las fechas de creación con -p) desde el directorio /home/usr/Folder/ que está en el servidor de número IP 192.168.1.5, al directorio actual (desde donde estamos ejecutando el comando ( . )). Luego de esto, nos pedirá la clave para ingresar al servidor. Después de escribirla, dejamos el proceso suspendido en el background con CTRL+Z. Finalmente, dejamos el proceso ejecutándose en el background con el comando

Copiar multiples archivos con un patrón

Si en un servidor tenemos, por ejemplo, los archivos arch1.pdf, arch2.pdf, ..., arch55.pdf; pero sólo queremos copiar algunos de ellos, podemos hacerlo si ellos siguen un patrón. Por ejemplo, si sólo queremos los con número par, entre el arch12.pdf y arch40.pdf, lo podemos hacer de la siguiente manera:

 scp -r -p usr@192.168.1.5:Folder/arch\{12..40..2\}.pdf  .

29 de Noviembre, 2010

BAJAR VARIOS ARCHIVOS DE INTERNET SIMULTÁNEMENTE

Digamos que tienes muchos archivos de fotos con extensión ".jpeg" en la pagina 'http://zeth.ciencias.uchile.cl/~mipagina'. Puedes bajar todos los archivos de esa carpeta (mipagina) con

wget -e robots=off -r -l1 --no-parent -A.jpeg http://zeth.ciencias.uchile.cl/~mipagina

NO SIRVE bajarlos con

wget http://zeth.ciencias.uchile.cl/~mipagina/*.jpeg

ya que esto solo funciona para sitios ftp.

Obviamente puedes bajar otro tipo de archivos, cambiando "-A.jpeg" por "-A.pdf", "-A.gif" o lo que sea.

29 de Noviembre, 2010

CONVERTIR VIDEOS DE YOUTUBE EN MP3

¿Quieres bajar música de YouTube? Aqui está la solución. Baja el ffmpeg:

sudo apt-get install ffmpeg

Solo por si acaso, instala libavcodec-extra-53:

sudo apt-get install libavcodec-extra-53

Ahora anda a FireFox, y baja el Add-On llamado "Video DownloadHelper 4.7.3". Cuando lo instales, va a aparecer un símbolo (3 bolitas de colores) a la izquierda de la barra del explorador, que se comenzará a mover cuando te metas a una página aceptada por el programa (YouTube, Google Video, National Geographic, hay montones...). Cuando estes viendo el video que te interesa, simplemente das click en la flechita al lado del símbolo giratorio y lo descargas.

Ahora, con el video descargado en un directorio a tu elección, das el comando

ffmpeg -i mi_archivo_de_youtube.flv mi_cancion.mp3

El formato flv es el formato por defecto de los videos de YouTube. Ahora puedes bajar discos completos de YouTube :P

Este es un programa que convierte todos los flv de una carpeta en mp3:

#!/bin/bash
# conversor de archivos de youtube a mp3
for i in $(ls *.flv);
do
 orig=$i
 dest=$(echo $i | sed -e "s/.flv/.mp3/")
 ffmpeg -i $orig $dest
done

Lo guardan en un archivo que se llame flv-to-mp3.sh y lo ejecutan en la carpeta donde están sus archivos:

./flv-to-mp3.sh

Acuérdense de darle los permisos de ejecución antes de ejecutar (chmod 755 flv-to-mp3.sh).

29 de Noviembre, 2010

CONECTAR A INTERNET DESDE LA TERMINAL

Listar las redes:

 iwlist wlan0 scanning

Esto debería listar las redes disponibles. Elegir la red que corresponda (En mi scanning dice ESSID: "fisica"):

 iwconfig wlan0 essid fisica

Conectar:

 dhclient wlan0


SISTEMA OPERATIVO

29 de Noviembre, 2010

CONVERTIR ARCHIVOS .rpm Y .tar.gz A UN .deb

Esto es útil para los usuarios de Debian/Ubuntu, ya que los paquetes .deb, a diferencia de los otros comprimidos, se instalan sólo con doble click o dpkg -i paquete.deb sin necesidad de descomprimir.

Necesitarás alien, asi que instalalo con

 sudo apt-get install alien

El comando

 alien -d archivo.rpm

convierte el .rpm a .deb. Si deseas convertirlo e instalarlo con un solo comando, ejecuta

 alien -i archivo.rpm

Para convertir el .tar, ejecuta

tar xfz nombre-del-paquete.tar.gz
cd nombre-del-paquete
./configure
make
sudo checkinstall
 

29 de Noviembre, 2010

MONTAR PEN-DRIVES

 mount -t vfat /dev/sdb1/ /media/nombre_de_la_carpeta

29 de Noviembre, 2010

HACER DVD

Escribir imagen .iso de DVD:

 readom dev=/dev/cdrom f=imagen.iso

Quemar imagen .iso a DVD:

 growisofs -Z /dev/cdrom=imagen.iso

29 de Noviembre, 2010

CAMBIAR EL FONDO DE LA PANTALLA DE LOGIN EN UBUNTU 10.04

Como se habrán usado los usuarios de Ubuntu 10.04, la pantalla de inicio (donde uno elije el usuario y da la contraseña) es, en principio, inmutable. Pero hay buenas noticias: el fondo se puede cambiar. El comando que hace la gracia es

 gksu -u gdm dbus-launch gnome-appearance-properties

que abre la misma pantalla de opciones que aparece cuando queremos cambiar el fondo de escritorio, sólo que esta vez se lo estaremos haciendo al fondo de la pantalla de bienvenida.