piping trovare alla testa

0

Ho uno script per leggere la prima riga di qualsiasi file di testo con una determinata estensione all'interno di una determinata cartella, in modo ricorsivo, ma non funziona. Il comando head non è funzionale.

#!/bin/bash
while true; do
(find ~/SpaceMonkey/MATLAB/Luo-Rudy -name '*.m') | head –n 1 > /dev/null
sleep 300
done

Che cosa sto facendo male qui?

    
posta BFH 26.02.2014 - 05:36
fonte

2 risposte

2

Il modo più semplice per fare ciò che intendi è utilizzare find per eseguire head per te.

Sostituisci la tua linea di ricerca esistente con:

find ~/SpaceMonkey/MATLAB/Luo-Rudy -name '*.m' -exec head -n 1 '{}' \;

Questo eseguirà head per ottenere la prima riga su ogni file corrispondente. Puoi reindirizzare l'output semplicemente aggiungendo > destination alla fine del comando.

    
risposta data 26.02.2014 - 06:16
fonte
1

Ci sono alcuni problemi con il tuo script.

Innanzitutto, stai inviando l'output finale da head a /dev/null , quindi non vedrai nulla di simile.

In secondo luogo, non stai effettivamente aprendo i file, stai solo passando l'elenco di file trovato da find in head , quindi anche se rimuovi il > /dev/null tu vedremo solo il nome del primo file. Se head viene letto da stdin, considera stdin come 'file', non come un elenco di file da elaborare.

Invece, vorrai fare qualcosa di più simile a questo:

#!/bin/sh
DIR="$HOME/SpaceMonkey/MATLAB/Luo-Rudy"
while true
do
    for filename in $(find $DIR -name '*.m')
    do
        head -n 1 $filename
        # or if you want the filename listed too:
        #echo "$filename $(head -n 1 $filename)"
    done
    sleep 300
done

Nota anche che se hai usato la shell zsh , potresti ottenere ciò in modo più semplice:

head -n 1 $DIR/**/*.m

La shell zsh (e alcuni altri) consente il globbing dei file ricorsivi, per consentire di passare tutti i file .m (in modo ricorsivo) a head come argomenti della riga di comando in un colpo solo.

    
risposta data 26.02.2014 - 05:57
fonte

Leggi altre domande sui tag