piping find to head

0

Tengo un script para leer la primera línea de cualquier archivo de texto con una cierta extensión dentro de una carpeta determinada, recursivamente, pero no funciona. El comando head no es funcional.

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

¿Qué estoy haciendo mal aquí?

    
pregunta BFH 26.02.2014 - 05:36

2 respuestas

2

La forma más fácil de hacer lo que pretendes es usar find para ejecutar head por ti.

Reemplaza tu línea de búsqueda existente con:

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

Esto ejecutará head para obtener la primera línea en cada archivo coincidente. Puede redirigir la salida simplemente agregando > destination al final del comando.

    
respondido por el Tony Williams 26.02.2014 - 06:16
1

Hay algunos problemas con tu script.

Primero, estás enviando la salida final de head a /dev/null , por lo que no verás nada desde la cabeza.

Segundo, no estás abriendo los archivos, solo estás pasando la lista de archivos encontrada por find a head , así que incluso si eliminas el > /dev/null Sólo veré el nombre del primer archivo. Si head lee desde stdin, trata a stdin como el 'archivo', no como una lista de archivos para procesar.

En cambio, querrás hacer algo más como esto:

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

Tenga en cuenta también que si usó el shell zsh , podría lograrlo de manera más simple:

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

El shell zsh (y algunos otros) permite el intercambio de archivos recursivos, para permitirle pasar todos los archivos% co_de (recursivamente) a .m como argumentos de línea de comandos de una sola vez.

    
respondido por el drfrogsplat 26.02.2014 - 05:57

Lea otras preguntas en las etiquetas