64 votes

Comment utiliser les genstrings dans plusieurs répertoires ?

J'ai un répertoire, qui a beaucoup de sous-répertoires. ces sous-répertoires ont parfois même des sous-répertoires. il y a des fichiers sources à l'intérieur.

Comment pourrais-je utiliser les genstrings pour parcourir tous ces répertoires et sous-répertoires ?

Disons que j'accède à mon répertoire racine dans le Terminal, et que je tape ceci :

genstrings -o en.lproj *.m

Comment pourrais-je lui dire maintenant de regarder dans tous ces répertoires ? Ou devrais-je ajouter un grand nombre de chemins relatifs séparés par des virgules ? comment ?

111voto

Brian King Points 1461

Une méthode serait :

find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj

xargs est un bon morceau de shell-foo. Il prend les chaînes de caractères en entrée standard et les convertit en arguments pour la fonction suivante. Cela remplira votre commande genstrings avec chaque fichier .m sous le répertoire courant.

Cette réponse manipule les espaces dans le chemin utilisé, ce qui la rend plus robuste. Vous devriez l'utiliser pour éviter de sauter des fichiers lors du traitement de vos fichiers sources.

Edit : comme dit dans les commentaires et dans d'autres réponses, *.m doit être cité.

0 votes

Cela ne fonctionne pas pour moi, mais la réponse de SEG ci-dessous a bien fonctionné (il y a une barre oblique inverse avant *.m).

8 votes

N'oubliez pas que lorsque vous tapez ceci dans le shell, *.m doit être cité (c'est-à-dire find ./ -name "*.m" ... ) parce qu'autrement le shell essaiera de l'étendre d'abord

0 votes

@Lance alors vous n'avez pas de fichiers '.m' dans le répertoire courant lorsque vous l'exécutez, et donc la substitution de l'interpréteur de commandes échoue. Si vous échappez le motif, cela fonctionnera quel que soit le contenu du répertoire courant.

91voto

Jonathan Zhan Points 975

Je ne sais pas exactement pourquoi, mais la commande de Brian n'a pas fonctionné pour moi. Ceci a marché :

find . -name \*.m | xargs genstrings -o en.lproj

EDIT : Lorsque j'ai écrit ce texte, j'étais pressé et j'avais besoin de quelque chose qui fonctionne. Le problème qui se posait pour moi lorsque j'utilisais la réponse acceptée ci-dessus était que "*.m" doit être cité (et les curieux peuvent trouver une explication quant à la raison pour laquelle c'est le cas dans les commentaires sur la réponse de Brian King). Je pense que la meilleure solution est d'utiliser la réponse originale avec le bit approprié cité, qui se lirait alors comme suit :

find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj

Je laisse cependant ma réponse originale intacte ci-dessus, au cas où elle aiderait encore quelqu'un, pour quelque raison que ce soit.

1 votes

Merci - C'était la même chose pour moi.

18voto

Simon Gislen Points 1199

Cela fonctionne pour moi :

find ./ -name \*.m -print0 | xargs -0 genstrings -o en.lproj

Merci à Brian et Uberhamster.

6voto

Ashishail Points 200

Je ne sais pas si quelqu'un l'a remarqué ou si l'option est apparue plus tard, mais il y a maintenant une -a est genstrings. Aucune des options ci-dessus n'a fonctionné pour moi. Voici ma solution.

find ./ -name "*.m" -exec echo {} \; -exec genstrings -a -o en.lproj {} \;

Ceci imprimera également le nom des fichiers lus.

Bien que la commande ci-dessus fonctionne bien, ce n'était pas exactement pour moi, parce que dans mon dossier de projet il y a beaucoup de fichiers qui sont dans le dossier mais pas inclus dans le projet xcode. Donc ce que j'ai fait, c'est de créer une liste de fichiers utilisés dans mon projet en analysant le fichier pbxproj. J'ai ajouté la liste dans filelist.txt, et j'ai lancé la commande suivante

while read f; do find ./ -name "$f" -exec echo {} \; -exec genstrings -a -o en.lproj {} \; ; done < filelist.txt

0 votes

Cela devrait être accepté)) Il couvre même les structures de dossiers sophistiquées . Merci @Ashishail

4voto

Emmanuel Ay Points 427

J'ai juste ajouté un autre chemin à la commande genstrings, comme ceci :

genstrings -o en.lproj *.m Classes/*.m

et ça a bien marché !

0 votes

Fonctionne, mais il ne vérifie pas les entrées en double de chaque répertoire spécifié. J'ai obtenu une entrée en double dans le fichier .strings avec la même clé et le même commentaire. Je suppose que cela fonctionne comme le drapeau -a.

2 votes

@Emmanuel c'est correct. L'option -a n'ajoute pas de nouvelles chaînes - elle ajoute TOUTES les chaînes à un fichier Localizable.strings existant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X