2010-04-30 22 views
55

Tengo un directorio, que tiene muchos subdirectorios. esos subdires a veces incluso tienen subdirectorios. hay archivos fuente adentro.¿Cómo usar genstrings en múltiples directorios?

¿Cómo podría usar genstrings para recorrer todos estos directorios y subdirectorios?

Digamos que cd a mi directorio raíz en la terminal, y luego debería teclear esto:

genstrings -o en.lproj *.m 

¿Cómo podría decirle ahora a mirar en todos estos directorios? ¿O tendría que agregar una gran cantidad de caminos relativos separados por comas? ¿cómo?

Respuesta

91

Un método sería:

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

xargs es un buen trozo de cáscara-foo. Tomará cadenas en entrada estándar y las convertirá en argumentos para la siguiente función. Esto rellenará el comando genstrings con cada archivo .m debajo del directorio actual.

Esta respuesta maneja espacios en la ruta utilizada por lo que es más robusto. Debe usarlo para evitar omitir archivos al procesar sus archivos fuente.

Editar: como se dijo en los comentarios y en otras respuestas, debe citarse * .m.

+0

Esto no funciona para mí, pero la respuesta de SEG a continuación funcionó bien (hay una barra invertida antes de * .m). – Martin

+7

No olvide que al tipear esto en el intérprete de comandos, '* .m' necesita ser citado (es decir' find./ -name "* .m" ... ') porque de lo contrario el shell intentará expandirlo primero – user102008

+0

funciona para mí sin las comillas * .m – Lance

84

No sé exactamente por qué, pero la orden de Brian no funcionó para mí. Esto hizo:

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

EDIT: Bueno, cuando escribí originalmente este estaba en un apuro y sólo necesitaba algo que funcionó. El problema que me estaba ocurriendo al usar la respuesta aceptada anteriormente era que "* .m" tiene que ser citado (y los curiosos pueden encontrar una explicación de por qué este es el caso en los comentarios sobre la respuesta de Brian King). Creo que la mejor solución es utilizar esa respuesta original con el bit apropiado citado, el cual terminaría:

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

estoy dejando mi respuesta original intacto anterior, sin embargo, en caso de que todavía ayuda a nadie por cualquier razón .

+1

Gracias - Fue lo mismo conmigo. – Lukasz

3

acabo añade otra ruta al comando genstrings, así:

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

..y todo salió bien!

Btw. algo útil sobre genstrings. Cuando continúa desarrollando su aplicación, genstrings tiene un modificador -a que agrega nuevas cadenas al archivo de cadena localizado.

+0

Funciona, pero no comprueba las entradas duplicadas de cada directorio especificado. Obtuve una entrada duplicada en el archivo .strings con la misma clave y comentario. Supongo que funciona como una bandera. – Hlung

+2

@Emmanuel eso es correcto. El distintivo -a no agrega cadenas nuevas-- anexa TODAS las cadenas a un archivo Localizable.strings existente. – jonsibley

-1

probar este

genstrings -o English.lproj ./Classes/*.m ./Classes/*.h ./Classes/subclass/*.m 

Si subcarpetas no están demasiado, esto va a funcionar perfectamente.

17

Esto funciona para mí:

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

Gracias a Brian y Uberhamster.

+5

Este es el único que funcionó para mí .. – Snowman

2

La siguiente mejora en las respuestas anteriores, esta se encuentra tanto en .hy archivos .m:

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

que tienen una una gran cantidad de código en archivos .mm, así que tengo que usar:

find . -name \*.m -or -name \*.mm | xargs genstrings 

u otras variantes, como

find . -name \*.m -or -name \*.mm | xargs -0 genstrings -o en.lproj 
4

No estoy seguro si alguien lo notó o la opción de vino más adelante, pero ahora hay una opción -a se genstrings. Ninguna de las opciones anteriores funcionó para mí. A continuación está mi solución.

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

Esto también imprimirá el nombre de los archivos leídos.

Aunque el comando anterior funciona bien, no fue exactamente para mí, porque en mi carpeta de proyecto hay muchos archivos que están en la carpeta pero no están incluidos en el proyecto xcode. Entonces, lo que hice fue crear una lista de archivos usados ​​en mi proyecto al analizar el archivo pbxproj. Se agregó la lista en filelist.txt, y se desencadenó debajo del comando

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

Esto debería ser aceptado)) Cubre incluso la estructura de carpetas sofisticada. Gracias @Ashishail – Roma

0

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

Esto rellenará el comando genstrings con cada archivo .m en el directorio actual. Luego crea la clave/contexto NSLocalizedString() en el archivo Localizable.string, que se puede usar en cualquier lugar del proyecto.

0

Swift

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

Si necesita el archivo en la carpeta misma

find ./ -name \*.swift -print0 | xargs -0 genstrings -o . 
1

Puesto que nadie ha publicado una solución tanto con Objective-C y Swift, pensé que me gustaría compartir cómo me hazlo.

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

Al utilizar este archivo de cadenas localizables serán reemplazados por cadenas de ambos los archivos rápidas y Objective-C.

Editar: Necesitas el cd en el directorio con todos tus subdirectorios.

Cuestiones relacionadas