OSX find não tem -printf action . O erro +: command not found é porque seu comando está entre os pulsos de atraso ('' ), so the shell is treating the results of the find command as a command and attempting to execute them, specifically it is trying to execute + ', que é a primeira coisa impressa pelo comando que você executou. Você receberá o mesmo erro se sua execução for
'echo -n "+"'
Carrapatos de volta são usados para salvar os resultados de um comando para uma variável, então o que está acima dá um erro, mas isso não acontece:
foo='echo -n "+"'
Você não diz qual é o resultado desejado. Com base na sua pergunta, presumo que você queira obter uma lista de todas as pastas em um determinado diretório que inicie com . e imprima seus nomes na mesma linha, citada e precedida por + . Se assim for, você pode fazer algo assim:
find ~/.mail/fastmail -maxdepth 1 -type d -name ".*" -exec echo -n "+'{}' " \;
Exemplo de saída:
+'/home/terdon/.mail/fastmail/.bar' +'/home/terdon/.mail/fastmail/.foo'
Para passar a saída deste comando como entrada para outro programa ( mailbox , por exemplo), faça isso:
mailbox 'find ~/.mail/fastmail -maxdepth 1 -type d -name ".*" -exec echo -n "+'{}' " \;'
ou
mailbox $(find ~/.mail/fastmail -maxdepth 1 -type d -name ".*" -exec echo -n "+'{}' " \;)
Em resposta ao comentário do OP:
Se você quiser apenas todas as pastas, não precisará de -name , para remover as aspas, apenas não cite {} . Também assumirei que você não quer a pasta pai ( fastmail ), portanto -mindpeth 1 :
find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d -exec echo -n "+{} " \;
Remover o caminho é um pouco mais complexo porque, ao contrário do que você poderia esperar , não é possível usar apenas basename na chamada -exec . Você precisa ser criativo, aqui estão algumas opções:
-
Analise com
awkmailbox 'find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d | awk -F"/" '{printf "+%s ",$NF}''-F"/"diz aawkpara usar/como o delimitador de campo e depois imprime+seguido pelo último campo ($NF) que será o nome da pasta. -
Use um loop
for(supondo que os nomes das pastas não tenham caracteres ou espaços estranhos)mailbox 'for dir in $( find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d ); do echo -n "+$(basename $dir) "; done'Se os nomes das pastas contiverem espaços ou caracteres estranhos, use isso:
mailbox 'find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d | while IFS= read -r dir; do echo -n "+$(basename $dir) "; done'