[Risolto][Bash] escludere serie di files da find

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

[Risolto][Bash] escludere serie di files da find

Messaggio da ixamit »

Ciao a tutti,
come da titolo avrei bisogno di escudere una serie più o meno lunga di files deprecati.
Attulmente uso il parametro "! - path" della find che non mi soddisfa, e tra le altre cose, non saprei come passare la lista.

Vi allego lo script che sto provando a scrivere:

Codice: Seleziona tutto

#!/usr/bin/env bash

# TODO fix include's prefix
I='/usr/include'

TMP=/tmp/.$$
>"$TMP"
while [ "$1" != "" ]; do
    for f in $I $I/sys $I/arpa $I/netinet; do
        r=$(find $f -maxdepth 1 ! -path "*/malloc.h" -xtype f | 
        xargs grep -l -E "((extern) +(\w+)[ *]+$1[ (]|(extern) +(\w+) +(\w+)[ *]+$1[ (]|# *define *$1[ (])")
        if [ $? -eq 0 ] && r=$(basename "$r"); then
            if ! grep --quiet "$r" "$TMP"; then
                echo  "#define <$r>" >> "$TMP"
            fi
        fi
    done
    shift
done
cat "$TMP" && rm -rf "$TMP"
Ultima modifica di ixamit il domenica 5 ottobre 2014, 12:09, modificato 1 volta in totale.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Bash] escludere serie di files da find

Messaggio da vaeVictis »

Potresti spiegare meglio la parte relativa solo al comando find e all'esclusione di file deprecati?
:)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [Bash] escludere serie di files da find

Messaggio da ixamit »

vaeVictis [url=http://forum.ubuntu-it.org/viewtopic.php?p=4661684#p4661684][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Potresti spiegare meglio la parte relativa solo al comando find e all'esclusione di file deprecati?
:)
Devo semplicemente greppare i files restituiti dalla find ad esclusione di una lista statica (costante) che mi creo a priori.
Nell'esempio dello script scarto un solo file *malloc.h* ma vorrei poter skippare un'eventuale lista tipo: "bar.h baz.h foo.h"...
grazie
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Bash] escludere serie di files da find

Messaggio da vaeVictis »

Sì, alla fine ci ero arrivato.
Ora, io farei in questo modo (che dovresti riadattare poi secondo le tue esigenze perché non ho letto per benino lo script):

1) contenuto della directory

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/ForumUbuntu$ find Prova/ -type f
Prova/file5.txt
Prova/file6.txt
Prova/file1.txt
Prova/file2.txt
Prova/file4.txt
Prova/file3.txt
2) lista statica dei file deprecati

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/ForumUbuntu$ FileDeprecati=( file2.txt file4.txt file6.txt )
3) esclusione dei file deprecati dal risultato di find

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/ForumUbuntu$ find Prova `for deprecato in ${FileDeprecati[@]}; do echo -n "! -name $deprecato "; done` -type f
Prova/file5.txt
Prova/file1.txt
Prova/file3.txt
Non dovrebbero esserci problemi legati all'esecuzione del comando for in una sottoshell.
Se ci dovessero essere, ti metti in una variabile l'output del ciclo for e poi usi quella invece della command substitution diretta.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [Bash] escludere serie di files da find

Messaggio da ixamit »

Fantastico!!!
grazie mille vaeVictis
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Risolto][Bash] escludere serie di files da find

Messaggio da vaeVictis »

:)
Sono contento che tu abbia trovato la soluzione interessante.
Ho avuto un problema analogo e l'ho risolto in questo stesso modo.

p.s.: non ho prestato particolare attenzione al quoting delle variabili e altre bashosità di questo tipo, dal momento che comunque credo tu debba riadattarlo al tuo script.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [Risolto][Bash] escludere serie di files da find

Messaggio da ixamit »

Allego un bozzetto dello script corretto e quasi funzionante. Dovrebbe mancare solo il match per le funzioni compex...

Codice: Seleziona tutto

#!/usr/bin/env bash

# TODO fix include's prefix
I='/usr/include'

# deprecated list
SKIP=( malloc.h )

TMP=/tmp/.$$
>"$TMP"
while [ "$1" != "" ]; do
    for f in $I $I/sys $I/arpa $I/netinet; do
        r=$(find $f -maxdepth 1 `for i in ${SKIP[@]}; do echo -n "! -name $i "; done` -xtype f | 
        xargs grep -l -E "((extern) +(\w+)[ *]+$1[ (]|(extern) +(\w+) +(\w+)[ *]+$1[ (]|# *define *$1[ (])")
        if [ $? -eq 0 ] && r=$(cut -c$((${#I}+2))- <<< "$r"); then
            if ! grep --quiet "$r" "$TMP"; then
                echo  "#include <$r>" >> "$TMP"
            fi
        fi
    done
    shift
done
cat "$TMP" && rm -rf "$TMP"
L'idea è di estrarre i riferimenti dai vari header C e l' ho scritto perché molte volte vengono presentati sorgenti C privi delle dichiarazioni prototypes.

Codice: Seleziona tutto

max@studio:~/src/script$ ./cdef feof atol isspace open close socket select pow
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <tgmath.h>
max@studio:~/src/script$ 
Suggerimenti e migliorie sono molto apprezzati
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 9 ospiti