2017-10-11 5 views
2

je cette commande trouver:Pour boucle pour résultat de la commande « trouver »

$ find . -name '*.jar' -exec grep -Hls BuildConfig {} \; 

je dois exécuter cette commande pour chaque résultat de la commande trouver ci-dessus:

$ zip -d RESULTPATH "*/BuildConfig.class" 

Alors puis-je faire ceci avec pour boucle ou non? Puis-je créer un fichier .sh qui fera ce dont j'ai besoin? Merci!

+0

Pertinent: https://stackoverflow.com/q/9612090/1531971 – jdv

+0

'RESULTPATH' est-il destiné à être" chacun des fichiers identifiés par la commande 'find'"? En outre, un fichier '.jar' est un zip. Voulez-vous dire 'grep -z'? En outre, ce qui est avec les citations sur votre ligne 'zip'? – ghoti

+0

oui, l'emplacement du chemin de résultat doit correspondre aux chemins trouvés par la commande find. Les guillemets sont manquants – user269721

Répondre

0

La commande grep dispose de deux canaux d'informations. Le premier et le plus évident est bien sûr stdout, où il envoie des correspondances qu'il trouve. Mais s'il trouve aucun correspond, il utilise également une valeur de sortie> 0 pour vous informer. Combiné avec l'option -q (calme), vous pouvez l'utiliser comme une option plus intelligente pour find:

$ find . -name '*.jar' -exec zgrep -sq BuildConfig {} \; -exec zip -d {} "*/BuildConfig.class" \; 

Cela suppose que vous voulez rechercher dans le fichier compressé à l'aide grep -Z, bien sûr. :)

Ou pour faciliter la lecture:

find . -name '*.jar' \ 
    -exec zgrep -sq BuildConfig {} \; \ 
    -exec zip -d {} "*/BuildConfig.class" \; 

Recherche fonctionne en exécutant chaque test en ordre. Vous pouvez considérer les options comme une série de filtres; l'option -name est les premiers filtres, et un fichier n'est transmis à la seconde -exec si le -exec précédent s'est terminé sans erreurs.

+0

Merci beaucoup! Tu m'as sauvé la vie – user269721

2

Une manière propre à exécuter une commande pour chaque résultat d'une commande grep avec xargs, utilise le -Z ou --null drapeau avec grep de rendre les résultats terminés par null, et le drapeau -0 avec xargs de sorte qu'il attend valeurs terminaison par null, comme ceci:

find . -name '*.jar' -exec grep -Z BuildConfig {} \; | xargs -0 zip -d RESULTPATH "*/BuildConfig.class 

j'ai enlevé les drapeaux Hls parce qu'ils semblent tous inutiles (même dangereux) dans votre cas d'utilisation.

Mais je crains que cela ne fonctionnera pas vraiment pour votre cas, car un fichier .jar est généralement un fichier binaire (archive zip des classes Java), donc je ne pense pas que grep aura jamais rien match. Vous pouvez donner zgrep un essai pour rechercher à l'intérieur des pots.

+0

il contiendra toujours des noms de texte en clair pour les répertoires. – 123