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
awk
mailbox 'find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d | awk -F"/" '{printf "+%s ",$NF}''
-F"/"
diz aawk
para 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'