2010-12-29 14 views
6

Tengo un directorio con algunas docenas de archivos. Me gustaría hacer algo con cada segundo archivo de este directorio. Por ahora sólo se utiliza find mando, pero con esto procesar todos los archivos:¿Cómo procesar cada segundo archivo en bash?

find ./dir/ -type f -exec cat {} \; 
+0

¿hay algún patrón especial del nombre para el segundo archivo? – ajreal

+0

@ajreal: Estaba pensando en esto. Todos los archivos son similares, pero terminan en '_tX.XXXXXXX' donde X's son algunos números. Por lo general, están en algún rango, por ejemplo, de 0.1 a 2.0 y crecen geométricamente desde el valor más pequeño hasta el más grande. Y no hay un número específico de archivos. Así que puedo tener 10 archivos en el rango de 0.1 a 2, o 100 archivos en el mismo rango. No estoy seguro de si hay algún patrón simple para unir cada segundo archivo. – klew

Respuesta

6
cnt=0; 
for file in $(find ./dir -type f); <-- if not too many matches 
do 
    let cnt=cnt+1; 
    if [ $cnt -eq 2 ]; 
    then echo $file;    <-- do something 
    cnt=0;       <-- alternate file 
    fi; 
done 

o

second_file=$(find -type f | head -2 | tail -1); 
+0

Gracias, funciona. En el primer ejemplo, debe agregar 'cnt = 0' dentro de' if' - de modo que será cada segundo archivo, no solo el segundo :) – klew

14
for file in `find dir -type f | awk 'NR % 2 == 0'`; do 
    echo $file 
done 

NR es el número de fila actual. Para obtener filas impares, use ... == 1.

+0

este es probablemente el más limpio de los métodos presentados. Buen material. – SaltyNuts

0

Tenía todos los archivos dos veces y necesitaba eliminar cada segundo archivo. Find acaba de devolverme archivos aleatorios, por lo tanto, agregué un tipo. Ahora parece que esto:

#!/bin/bash 
DIRNAME="<directoryNameContainingYourFiles>" 
for file in `find $DIRNAME -type f | sort | awk 'NR % 2 == 0'`; do 
    echo "going to modify" $file 
    # ls -laFh $file   # show file details 
    # rm $file     # delete file 
    # mv $file <newDirName> # move file to <newDirName> 
done 

poner esto en un archivo llamado scriptName, ejecute

chmod +x scriptName 

y empezar llamando

./scriptName 
Cuestiones relacionadas