Comandos que se vuelven negativos

Los comandos cp, mv, rm, rmdir, cat, more, less, ls, locate y find pueden utilizar patrones negativos.

rm !(*.bam)

El comando anterior elimina todos los ficheros que no terminan en .bam. Basta con añadir ! antes del patrón y encerrar este entre paréntesis.

Veamos un ejemplo un poco más complejo:

find !(*.fa|*.fasta|*.fq|*.fastq)

Donde el carácter | es el operador lógico OR. Este comando busca recursivamente en el directorio de trabajo todos los ficheros que no terminan en .fa, .fasta, .fq o .fastq, es decir, todos los ficheros que no son FASTA ni FASTQ.

Y ahora un ejemplo dentro de un bucle for:

for file in $(find !(*.fa|*.fasta|*.fq|*.fastq))
do
    echo $(ls -s $file | grep -v '^total')
done

Expliquemos este ejemplo línea a línea:

  • La primera línea dice, literalmente, "para cada elemento (file) de la lista de ficheros que no acaban en .fa, .fasta, .fq ni .fastq devuelta por find…​".

  • "Haz lo siguiente". La segunda línea marca el inicio del bloque de código que se repite en cada iteración.

  • "Imprime el nombre y el tamaño de cada elemento (file)". El comando ls -s no solo lista los ficheros y sus tamaños, sino que también muestra información de los subdirectorios (en realidad los directorios también son ficheros en UNIX). Para filtrar las líneas impresas correspondientes a los subdirectorios utilizamos grep. Usar la opción -v en grep es equivalente a utilizar ! con otros comandos: muestra las líneas que no cumple el patrón, en este caso que no empiezan por total.

  • "Hecho". Termina el bloque de código que se repite en cada iteración.