Question UNIX recherche les répertoires contenant un fichier particulier (pom.xml) puis exécute la commande dans ce répertoire


Je veux, à partir d'un répertoire racine, trouver tous les répertoires contenant un certain nom de fichier (pom.xml), puis cd vers ce répertoire et exécuter une commande. Je peux le faire dans un script mais j'espérais le faire avec une seule commande de ligne.

jusqu'à présent j'ai

find . -type f -name 'pom.xml' |sed 's#\(.*\)/.*#\1#'

Cela donne les dirs dont j'ai besoin ... maintenant je dois entrer dans chacun et exécuter ma commande


4
2018-03-09 14:34


origine


Pourquoi avez-vous besoin de vous connecter au répertoire pour exécuter votre commande? Il suffit d'exécuter la commande sur /path/to/pom.xml
Cette question dit clairement que vous n'écrivez pas de script shell, il appartient au superutilisateur - Tim Post♦
@tim il essaie d'éviter la programmation qui devrait être la première pensée des programmeurs;) - sfussenegger
@ dnagirl la commande est en train d'exécuter un script qui crée de nouveaux répertoires etc dans le répertoire avec le fichier pom.xml


Réponses:


trouver a -exec et -execdir. Pour un maven, tu ferais

# executes `mvn clean install` in any directory where pom.xml was found
find . -name pom.xml -execdir mvn clean install \;

6
2018-03-09 14:44



-execdir est exactement ce qui est nécessaire. - William Jackson


Cela trouvera les répertoires:

find . -name pom.xml -printf '%h\n'

alors vous pourriez lire les répertoires et exécuter votre commande:

find . -name pom.xml -printf '%h\n' | while read dir; do ( cd "$dir"; command ... ) done

Si vous êtes paranoïaque à propos des nouvelles lignes intégrées dans les noms de répertoires (et sérieusement, qu'est-ce qui ne va pas avec les gens?), Vous pouvez utiliser "\ 0" dans printf, puis utiliser xargs pour exécuter la commande:

find . -name pom.xml -printf '%h\0' | xargs -0 -L 1 sh -c 'dir="$0"; cd "$dir"; command ...'

2
2018-03-09 14:39





Il y a aussi:

find . -type f -exec mvn -f {} clean install \;

Cependant, je pense que vous devriez examiner les options Maven disponibles pour ce faire. Bien qu'il ne soit plus présent dans Maven 3.x, Maven 2.x a le -r option qui fait exactement cela. Une meilleure façon est de créer un agrégat pom.xml qui contient les fichiers souhaités en tant que modules, et vous pouvez ensuite utiliser le -rf et -pl choisir sélectivement lequel construire.


1
2018-03-10 04:34





Si vous voulez appliquer les propriétés svnignore basées sur un fichier dont vous ne connaissez pas le chemin absolu, vous pouvez utiliser:

#!/bin/sh
find -name pom.xml -execdir pwd \; | while read project_dir
do
svn propset svn:ignore -F support-tools/svn/svnignore.cfg $project_dir
done

J'utilise celui-ci dans mes projets actuels, car chaque développeur a svn checkout sur un emplacement différent et il ne change pas le répertoire de travail à partir duquel exécuter la commande svn. Pour d'autres usages, utilisez

find -name -execdir

1
2017-10-08 09:16





Que diriez-vous:

find / -type f -name 'pom.xml' -print | while read FILE; do cd `dirname ${FILE}` && /run/my/script; done

Si vous pouvez modifier le script pour qu'il prenne un répertoire comme argument, les éléments suivants devraient fonctionner:

find / -type f -name 'pom.xml' -exec /run/my/script `dirname {}` \;

0
2017-10-08 10:10





Pour trouver les dossiers uniques contenant un type de fichier donné, vous pouvez utiliser:

find . -type f -name *.png | sed 's#\(.*\)/.*#\1#' | uniq

Cela listera tous les répertoires uniques, y compris les fichiers PNG.


0
2018-03-14 03:43



C'est une réponse raisonnable - à une différent question. Cela n'a que la relation la plus mince avec la question qui a été posée ici. - Scott


Vous pourriez utiliser xargs:

 xargs -- construct argument list(s) and execute utility

SYNOPSIS

  xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
        [-L number] [-n number [-x]] [-P maxprocs] [-s size]
        [utility [argument ...]]

LA DESCRIPTION

 The xargs utility reads space, tab, newline and end-of-file delimited
 strings from the standard input and executes utility with the strings
 as arguments.

 Any arguments specified on the command line are given to utility upon
 each invocation, followed by some number of the arguments read from the
 standard input of xargs.  The utility is repeatedly executed until stan-
 dard input is exhausted.

0
2018-03-09 14:39