Quelque chose comme ce qui suit est ce que je cherche, mais mon code ne fonctionne pas, peu importe comment je m'échappe {}
et+
;
find ./ -maxdepth 1 -type d -name '.*' -exec \
find {} -maxdepth 1 -type f -name '*.ini' -exec \
md5sum \{\} \\; \;
Après avoir vu cette question Unix - & - Linux , j'ai trouvé que le code suivant fonctionne, mais il n'est pas imbriqué trouver en tant que tel, et je soupçonne qu'il existe une meilleure façon de faire ce travail particulier.
find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
find "$x" -maxdepth 1 -type f -name "*.ini" \
-exec md5sum \{\} \;; \
done' _ {} \+
Existe-t-il un moyen d'imbriquer find -exec
sans avoir besoin d'invoquer un shell (comme ci-dessus), avec toutes ses citations délicates et ses contraintes d'échappement?
Ou cela peut-il être fait directement dans une seule commande find, en utilisant un mélange de ses nombreux paramètres?
text-processing
find
filenames
Peter.O
la source
la source
find
, mais sifind
vous ne pouvez pas le faire, alors pourquoi est-ilfind
si vénéré (?) Que l'outil- à utiliser pour trouver des fichiers? ... J'ai ensuite trouvé que celafind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+
fonctionnait bien dans ma situation (la référence de jw013-prune
m'a amené à cela dans la page de manuel), mais je me demande si c'est une méthode robuste (en général). Je n'ai jamais vraiment utiliséfind
(en moins d'un an de Linux) commelocate
j'ai fait presque tout ce dont j'ai besoin, donc c'est un territoire inconnu.-path
test est exactement ce que j'allais suggérer. Avec cela, vous devriez pouvoir faire tout ce que vous voulez (désolé pour l'association Ace Of Base;))Réponses:
J'essaierais d'utiliser une seule recherche comme:
ou même (pas
find
du tout, juste un globbing de coquille)bien que cela ne soit pas
-type f
coché, cela ne fonctionne que si vous n'avez pas de répertoires / non-fichiers se terminant par.ini
. Si vous le faites, vous pourriez utiliserqui perdrait cependant l'avantage de n'avoir besoin que d'une seule invocation md5sum.
Éditer
Pour une méthode de chaînage générale et sûre
find
, vous pouvez faire quelque chose commela source
-f
(f?), Puis une autre erreur avec-execdir
.. Quand je remplace -execdir par -exec, et / ou que je remplace également md5sum par print, je n'obtiens rien ..find
... Ce n'est pas tellement que je veux juste que cet exemple soit résolu, je cherche des informations sur les façons de trouver-fu .. . peut-être qu'il y a plus de peluches que fu dans find .. (je ne sais pas, parce que je ne l'ai pratiquement jamais utilisé), et c'est la première situation que je voulais vraiment utiliser (pour les fichiers image en fait) et le La fonctionnalité -exec dont j'ai tant entendu parler ne semble pas aussi puissante que son représentant (?) fait allusion à ... (+1 pour les alternatives, cependant) .. mais votrefind
exemple ne fonctionne tout simplement pas (encore )find
commande: ...find: The relative path
~ / bin 'est inclus dans la variable d'environnement PATH, qui n'est pas sécurisée en combinaison avec l'action -execdir de find. Veuillez supprimer cette entrée de $ PATH` .... Alors peut-être que cela fonctionnera, mais je dois dire que j'essaie de me débarrasser de ~ / bin depuis un moment maintenant ... Je vais devoir en prendre plus regardez-le sérieusement ... je ne sais pas où je l'ai mis ... aucune idée où il se cache; le~/bin
dans monfind
est mieux apprécié dans les situations qui ne peuvent pas être entièrement réalisées avec des globes, mais comme ce genre de situations est rare, je n'ai normalement pas besoin de trouver grand-chose.Votre problème d'origine ne nécessite pas d'appeler find récursivement mais je suppose que ce n'était pas le point.
Je pense qu'il n'est pas possible d'appeler find de manière récursive comme vous le souhaitez.
Ce qui suit n'appelle pas non plus la recherche récursivement (ou l'imbrication, quel que soit son nom), mais ne pouvez-vous pas simplement prendre un jeu de résultats de la première recherche et le nourrir dans la seconde? Voici comment je ferais instinctivement:
Vous pouvez également utiliser
xargs
pour exécuter la deuxième recherche.Mise à jour:
Je voulais ajouter que parce que la plupart des utilitaires UNIX prennent plusieurs arguments de nom de fichier au lieu d'un, vous pouvez généralement éviter le
-exec
tout:Lors de l'imbrication des contre-coups, il vous suffit d'ajouter des barres obliques inverses
\
avant celles intérieures.Si nous imaginons que cela
md5sum
ne prend qu'un seul argument de nom de fichier, nous pouvons toujours l'enrouler dans unefor
boucle:Notez que cela devient plus difficile si des noms de fichiers / répertoires commençant par
-
ou contenant un espace sont impliqués. Les utilitaires UNIX ne fonctionnent pas bien avec eux. Dans ce cas , l' ajout./
,--
ou citations est nécessaire.De toute évidence, l'exemple original n'est pas bon, car nous pourrions simplement faire:
la source
find
méthodes affichées obtiennent une erreur lorsqu'un fichier / répertoire contient des espacesmd5sum .*/*.ini
... Cela fonctionne bien ... Je commence à avoir l'impression générale que * Warren Young * commenter les choses qui deviennent `` complexes ''find
se produit tôt dans le jeu :), mais je suppose que celafind
prend tout son sens lorsque les tests de condition sont plus complexes, mais en ce qui concerne l'imbrication -exec, j'ai assez bien abandonné l'idée, car il semble qu'il existe des moyens plus simples de le faire .. (mais perl n'est pas (encore) "simple" pour moi ...)Au moins, j'ai réussi à imbriquer 2 commandes de recherche:
Mais je n'ai pas résolu d'invoquer un autre appel -exec (dir) - à partir de là.
la source