2010-04-30 10 views
55

Ho una directory, che ha molte sottodirectory. quei sottodivari a volte hanno anche sottodivisioni. ci sono file sorgente all'interno.Come usare genstrings su più directory?

Come potrei usare i genstring per attraversare tutte queste dir e sottodirectory?

Diciamo che il mio cd per dir root nel terminale, e quindi vorrei digitare questo:

genstrings -o en.lproj *.m 

Come potrei dire ora di guardare in tutte queste directory? O dovrei aggiungere molti percorsi relativi separati da virgola? Come?

risposta

91

Un metodo potrebbe essere:

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

xargs è un bel pezzo di guscio-foo. Prenderà delle stringhe standard in e le convertirà in argomenti per la funzione successiva. Questo popolerà il comando genstrings con ogni file .m sotto la directory corrente.

Questa risposta gestisce gli spazi nel percorso utilizzato in modo che sia più robusto. Dovresti usarlo per evitare di saltare i file durante l'elaborazione dei tuoi file sorgente.

Modifica: come detto nei commenti e in altre risposte, * .m dovrebbe essere citato.

+0

Questo non funziona per me, ma la risposta di SEG di seguito ha funzionato correttamente (c'è un backslash prima di * .m). – Martin

+7

Non dimenticare che quando si digita questo nella shell, '* .m' deve essere quotato (cioè' find ./ -name "* .m" ... ') perché altrimenti la shell proverà ad espanderlo prima – user102008

+0

funziona per me senza le virgolette intorno a * .m – Lance

84

Non so esattamente perché, ma il comando di Brian non ha funzionato per me. Questo ha fatto:

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

EDIT: Beh, quando ho originariamente scritto questo ero di fretta e solo qualcosa di necessario che ha funzionato. Il problema che stava accadendo per me quando usavo la risposta accettata sopra era che "* .m" deve essere citato (e il curioso può trovare una spiegazione sul perché questo è il caso nei commenti sulla risposta di Brian King). Credo che la soluzione migliore è quella di utilizzare questa risposta originale con il bit appropriato citato, che sarebbe quindi leggere:

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

Sto lasciando la mia risposta originale intatta sopra, però, nel caso in cui aiuta ancora nessuno per qualsiasi motivo .

+1

Grazie - Era lo stesso con me. – Lukasz

3

Ho appena aggiunto un altro percorso al comando genstrings, in questo modo:

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

..e andava bene!

Btw. una cosa a portata di mano sui genstrings. Quando continui a sviluppare la tua app, genstrings ha uno switch -a che aggiunge nuove stringhe al file di stringa localizzato.

+0

Funziona, ma non controlla le voci duplicate da ciascuna directory specificata. Ho ottenuto una voce duplicata nel file .strings con la stessa chiave e commento. Immagino che funzioni come una bandiera. – Hlung

+2

@Emmanuel che è corretto. Il flag -a non aggiunge nuove stringhe-- aggiunge tutte le stringhe a un file Localizable.strings esistente. – jonsibley

-1

Prova questa

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

Se le sottocartelle non sono troppo, questo funzionerà perfettamente.

17

questo funziona per me:

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

Grazie a Brian e Uberhamster.

+5

Questo è l'unico che ha funzionato per me .. – Snowman

2

Di seguito migliora le risposte precedenti, questo troverete sia file .he .m:

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

ho un avere un sacco di codice nei file .MM quindi devo usare:

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

o altre varianti, come ad esempio

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

Non sono sicuro se qualcuno se ne è accorto o l'opzione è venuto più tardi, ma ora c'è un'opzione -a è genstrings. Nessuna delle opzioni di cui sopra ha funzionato per me. Di seguito è la mia soluzione.

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

Questo stamperà anche il nome dei file letti.

Anche se il comando precedente funziona correttamente, non era esattamente per me, perché nella mia cartella di progetto ci sono molti file che giacciono nella cartella ma non sono inclusi nel progetto xcode. Quindi quello che ho fatto è stato, creato un elenco di file utilizzati nel mio progetto analizzando il file pbxproj. Aggiunta l'elenco in filelist.txt e attivato sotto il comando

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

Questo dovrebbe essere accettato)) Copre anche la struttura di cartelle sofisticate. Grazie a @Ashishail – Roma

0

trovare ./nome "* .m" -print0 | xargs -0 genstrings -o en.lproj

Questo popolerà il comando genstrings con ogni file .m nella directory corrente. Di creare la "chiave/contesto" NSLocalizedString() nel file Localizable.string, che può essere utilizzato in qualsiasi punto del progetto.

0

Swift

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

Se è necessario il file nella stessa cartella

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

Dal momento che nessuno ha pubblicato una soluzione sia con Objective-C e Swift, ho pensato che vorrei condividere come mi fallo.

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

Utilizzando questo file stringhe localizzabili saranno sostituiti con le stringhe da entrambi i file veloci e Objective-C.

Modifica: È necessario cd nella directory con tutte le sottodirectory.

Problemi correlati