3

Я пытаюсь использовать следующую команду на Mac OSX Mountain Lion, чтобы получить список моих почтовых папок как часть моего файла .muttrc:

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

Как я могу переписать это, чтобы получить желаемый результат?

1 ответ1

8

OSX find не имеет действия -printf. Ошибка +: command not found потому что ваша команда заключена в обратные тики (`` ), so the shell is treating the results of the поиска command as a command and attempting to execute them, specifically it is trying to execute+`, которая первая вещь, напечатанная командой, которую вы выполнили. Вы получите ту же ошибку, если ваш запуск

`echo -n "+"` 

Обратные галочки используются для сохранения результатов команды в переменной, поэтому вышеприведенное выдает ошибку, но это не так:

foo=`echo -n "+"`

Вы не говорите, каков ваш желаемый результат. Исходя из вашего вопроса, я предполагаю, что вы хотите получить список всех папок в данном каталоге, которые начинаются с . и напечатайте их имена в той же строке, заключенные в кавычки и перед которыми стоит + . Если это так, вы можете сделать что-то вроде этого:

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

Образец вывода:

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

Чтобы передать выходные данные этой команды в качестве входных данных другой программе (например, mailbox ), сделайте следующее:

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

или же

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

В ответ на комментарий ОП:

Если вам нужны все папки, вам не нужно -name , чтобы удалить кавычки, просто не заключайте в кавычки {} . Я также предполагаю, что вам не нужна родительская папка (fastmail), поэтому -mindpeth 1:

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

Удаление пути немного сложнее, потому что, вопреки тому, что вы могли ожидать, вы не можете просто использовать basename в вызове -exec . Вам нужно проявить творческий подход, вот несколько вариантов:

  • Разобрать с awk

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

    -F"/" указывает awk использовать / в качестве разделителя полей, а затем печатать + за которым следует последнее поле ($NF), которое будет именем папки.

  • Используйте цикл for (при условии, что в именах ваших папок нет странных символов или пробелов)

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

    Если имена ваших папок содержат пробелы или странные символы, используйте это вместо:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .