Il comando find sta dando errore su Mountain Lion


3

Sto provando a utilizzare il seguente comando su Mac OSX Mountain Lion per ottenere un elenco delle mie cartelle di posta come parte del mio file .muttrc:

`echo -n "+ "; find ~/.mail/fastmail -maxdepth 1 -type d -name ".*" -printf "+'%f' "`
find: -printf: unknown primary or operator
-bash: +: command not found

Come posso riscriverlo per ottenere il risultato desiderato?


Se provieni da Linux o ricevi suggerimenti da una fonte Linux, vale sempre la pena ricordare che molti comandi su OSX sono versioni BSD, non quelli GNU con cui potresti avere familiarità. Differiscono in molti modi piccoli e sottili e anche in alcuni modi grandi, non così sottili.
Telemaco,

Risposte:


8

OSX find non ha -printfazione . L' +: command not founderrore è perché il tuo comando è racchiuso tra i segni di spunta (`` ), so the shell is treating the results of thetrova command as a command and attempting to execute them, specifically it is trying to execute+ `che è la prima cosa stampata dal comando che hai eseguito. Otterrai lo stesso errore se esegui

`echo -n "+"` 

I segni di spunta posteriori vengono utilizzati per salvare i risultati di un comando in una variabile, quindi quanto sopra dà un errore ma questo non:

foo=`echo -n "+"`

Non dici quale sia l'output desiderato. Sulla base della tua domanda, presumo che tu voglia ottenere un elenco di tutte le cartelle in una determinata directory che iniziano con a .e stampano i loro nomi sulla stessa riga, tra virgolette e precedute da a +. In tal caso, puoi fare qualcosa del genere:

find ~/.mail/fastmail -maxdepth 1 -type d -name ".*"  -exec echo -n "+'{}' " \;

Uscita campione:

+'/home/terdon/.mail/fastmail/.bar' +'/home/terdon/.mail/fastmail/.foo' 

Per passare l'output di questo comando come input a un altro programma ( mailboxad esempio), procedere come segue:

mailbox `find ~/.mail/fastmail -maxdepth 1 -type d -name ".*"  -exec echo -n "+'{}' " \;`

o

mailbox $(find ~/.mail/fastmail -maxdepth 1 -type d -name ".*"  -exec echo -n "+'{}' " \;)

In risposta al commento di OP:

Se vuoi solo tutte le cartelle, non è necessario -name, per rimuovere le virgolette, semplicemente non citare {}. Supporrò anche che non desideri la cartella principale ( fastmail), quindi -mindpeth 1:

find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d -exec echo -n "+{} " \;

La rimozione del percorso è leggermente più complessa perché, contrariamente a quanto ci si potrebbe aspettare , non è possibile utilizzare solo basenamenella -execchiamata. Devi essere creativo, ecco alcune opzioni:

  • Analizza con awk

    mailbox `find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d | 
     awk -F"/" '{printf "+%s ",$NF}'`
    

    -F"/"dice awkdi usare /come delimitatore di campo e quindi stampare +seguito dall'ultimo campo ( $NF) che sarà il nome della cartella.

  • Usa un forciclo (supponendo che i nomi delle tue cartelle non abbiano caratteri o spazi strani)

       mailbox `for dir in $(
         find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d
        ); do echo -n "+$(basename $dir) "; done`
    

    Se i nomi delle tue cartelle contengono spazi o caratteri strani, usa invece questo:

    mailbox `find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d | 
      while IFS= read -r dir; do echo -n "+$(basename $dir) "; done`
    

Grazie. Sto cercando di utilizzare questo per elencare tutte le mie cassette postali nella mia cartella di posta da utilizzare nel mio file .muttrc. Il codice originale che ho preso in prestito da usato: cassette postali echo -n "+ "; find ~/Maildir -maxdepth 1 -type d -name ".*" -printf "+'%f' " Come avrei usato l'esempio sopra per dare l'output a "cassette postali"?
user222332

@ user222332 davvero allo stesso modo, vedi risposta aggiornata.
terdon,

@utente222332 sei il benvenuto. Se il mio suggerimento ha risposto alla tua domanda, contrassegnalo come accettato in modo che il thread possa essere contrassegnato come risposta.
terdon,

andrà bene. 1 follow-up rapido. L'utilizzo di find ~/.mail/fastmail -maxdepth 1 -type d -name "*" -exec echo -n "+'{}' " \;mi fornisce il percorso completo della casella di posta + '/ Users / trey / .mail / fastmail / INBOX.mutt' Come posso modificare l'output in + INBOX.mutt (rimuovere il percorso e rimuovere i singoli segni di spunta)?
user222332

1
@ user222332 vedi risposta aggiornata. In futuro, ti preghiamo di spiegare l'output desiderato nella tua domanda reale in modo che possiamo sapere come rispondere.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.