2016-10-20 2 views
0

J'ai cette commande find pour obtenir tous les fichiers modifiés dans les 50 dernières secondes qui correspond à la regex suivante hell\d dans les 1000 derniers caractères. J'utilise la queue pour obtenir les 1000 derniers caractères afin d'accélérer la recherche car les fichiers à vérifier sont énormes (3gb en moyenne).Comment combiner deux commandes dans le paramètre -exec de find?

find /home/ouhma -newermt '50 seconds' -type f | 
while read fic; do 
    if tail -c 1000 "${fic}" | LANG=C LC_ALL=C grep -Pq 'hell\d'; then 
     echo "${fic}" 
    fi 
done 

Il est posible d'utiliser -exec paramètre pour remplacer cette boucle laid et pour récupérer encore plus vite le résultat?

Cela fonctionne, mais je ne sais pas si c'est la meilleure façon de le faire:

find /home/ouhma -newermt '50 seconds' -type f -exec bash -c 'LANG=C LC_ALL=C grep -Pq "hell\d" <(tail -c 1000 "{}") && echo "{}"' \; 

Répondre

1

Plusieurs actions -exec peuvent suivre un autre, un -exec sera lancé si la -exec précédente réussit-à-dire la commande lancée par -exec retourne état de sortie 0.

Do:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \ 
     bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1")' _ {} \; -exec echo {} \; 

Comme vous êtes juste l'impression le nom du fichier, cela suffirait cependant:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \ 
     bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1") && echo "$1"' _ {} \; 
+0

Si je teste votre commande de cette façon: 'trouver /home/ouhma/hello.txt -exec LC_ALL = C grep -PQ 'enfer \ d' <(queue -c 1000 {}) \; -exec echo {} \; ' Il renvoie l'erreur suivante: ' queue: impossible d'ouvrir '{}' pour la lecture: Aucun fichier ou répertoire trouvé: 'LC_ALL = C': Aucun fichier ou répertoire ' – harrison4

+0

@ ouhma Vérifiez mes modifications. – heemayl

+0

La création d'un 'bash' pour chaque fichier ne sera pas plus rapide que la propre tentative d'OP. – anubhava