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.