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`