2010-12-29 2 views
6

Ho una directory con alcune dozzine di file. Mi piacerebbe fare qualcosa con ogni secondo file da questa directory. Ormai ho usato solo find comando ma con questo ho elaborare tutti i file:Come elaborare ogni secondo file in bash?

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

c'è qualche modello speciale di nome per il secondo file? – ajreal

+0

@ajreal: stavo pensando a questo. Tutti i file hanno un aspetto simile, ma termina con '_tX.XXXXXXX' dove X's sono alcuni numeri. Di solito sono in un certo intervallo, ad esempio da 0,1 a 2,0 e crescono geometricamente dal più piccolo valore al più grande. E non esiste un numero specifico di file. Quindi posso avere 10 file nell'intervallo da 0,1 a 2 o 100 file nello stesso intervallo. Non sono sicuro se ci sia qualche schema semplice per abbinare ogni secondo file. – klew

risposta

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

Grazie, funziona. Nel primo esempio è necessario aggiungere 'cnt = 0' all'interno di' if' - quindi sarà ogni secondo file, non solo secondo :) – klew

0

Se si desidera eseguire my_cmd su ciascuno dei file alternativo, questo può aiutare

find ./dir -type f | sort -n | sed -n '1~2!p' | sed 's/^/mycmd /' | sh 

ho copiato SED da How to remove every other line with sed?

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

NR è il numero di riga corrente. Per ottenere righe dispari, usa ... == 1.

+0

questo è probabilmente il metodo più pulito presentato. Roba buona. – SaltyNuts

0

Avevo ogni file due volte e dovevo eliminare ogni secondo file. Trova mi ha appena restituito file casuali, quindi ho aggiunto un ordinamento. E ora si presenta così:

#!/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 

mettere questo in un file chiamato scriptName, gestito

chmod +x scriptName 

e avviarlo chiamando

./scriptName