OSX find
non ha -printf
azione . L' +: command not found
errore è perché il tuo comando è racchiuso tra i segni di spunta (`` ), so the shell is treating the results of the
trova 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 ( mailbox
ad 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 basename
nella -exec
chiamata. 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 awk
di usare /
come delimitatore di campo e quindi stampare +
seguito dall'ultimo campo ( $NF
) che sarà il nome della cartella.
Usa un for
ciclo (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`