find command está dando erro no Mountain Lion

3

Estou tentando usar o seguinte comando no Mac OSX Mountain Lion para obter uma lista das minhas pastas de e-mail como parte do meu arquivo .muttrc:

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

Como posso reescrever isso para obter o resultado desejado?

    
por user222332 06.05.2013 / 13:53

1 resposta

8

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 a awk 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'
    
por 06.05.2013 / 14:09