Получите список имен каталогов с находкой

У Вас есть Escape $. Иначе $(ssh-agent -s) будет оценен на Вашей локальной машине вместо машины шлюза.

ssh user@Gateway "ssh Target 'eval \$(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"

Можно проверить результаты выхода при помощи эха

$ echo "foo $(echo bar)"
foo bar
$ echo "foo \$(echo bar)"
foo $(echo bar)
37
23.08.2013, 11:09
8 ответов

Обновление:

Более короткая альтернатива:

 find . -maxdepth 1 -type d | cut -c 3-

Даст Вам имена, один на строку, без любых наклонных черт

18
27.01.2020, 19:36
  • 1
    @downvoter.. downvote без объяснения не помогает никому (OP, ТАК или меня). Это - функциональное решение вопроса OP. Я рад исправить ошибку, если указано или улучшить ответ, но это требует конструктивной обратной связи, а не просто анонимного "щелчка". –  Levon 24.08.2012, 17:02
  • 2
    я - тот, который downvoted, когда Ваш ответ включал парсинг ls. В то же время я отправил ссылку на то, почему это - плохая идея о другом ответе, который был удален с тех пор. В то время было только 2 ответа, и причина казалась очевидной. Я рад, что Вы указали на неоднозначность и здесь являетесь моим объяснением. Для записи я повернул свой downvote в upvote, потому что я соглашаюсь с Вашим текущим ответом. –  rahmu 25.08.2012, 16:30
  • 3
    @rahmu, Дающий объяснение Вашего downvote в другом вопросе, не полезен мне (и только очевиден для Вас). Кроме того, в то время как это - лучшее решение, решение, которое я отправил прежде, работало просто великолепно (да, я знаком с Ваш, "не используют ls" ссылка - но это не применяется вслепую во всех случаях). Если бы у Вас есть встречный пример для того, почему мое начальное решение не работало бы, я хотел бы знать это (так, чтобы я мог на самом деле узнать о чем-то из этого), иначе Вы просто отправляете ссылку и не предлагаете что-либо конструктивное. –  Levon 25.08.2012, 19:33
  • 4
    Полагайте, что существует a \n в имени каталога Вы не можете использовать сокращение для получения его (который является тем, что Вы делали когда я downvoted Вы). Существует немного случаев где ls не ведет себя опасно, и почти всегда более безопасно использовать иначе. –  rahmu 25.08.2012, 20:17

С GNU find можно использовать -printf опция:

find . -maxdepth 1 -type d -printf '%f\n'

Как отмечено Paweł в комментариях, если Вы не хотите, чтобы текущий каталог был перечислен, добавляют -mindepth 1, например:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
42
27.01.2020, 19:36
  • 1
    я не могу найти упоминание о -printf опция в последней спецификации POSIX и интересно, насколько портативный это-... –  rahmu 25.08.2012, 16:37
  • 2
    @rahmu: Это было протестировано с GNU, находят. Ни один из printf опции упоминаются POSIX, и они, кажется, не поддерживаются частью из другого find версии. Находка GNU может быть установлена в большинстве мест, так в этом смысле это портативно. –  Thor 25.08.2012, 16:52
  • 3
    также добавляет -mindepth 1 если Вы хотите избавиться от . –  Paweł Prażak 26.09.2017, 12:20

Используя GNU находят, можно использовать-mindepth для предотвращения, находят от соответствия текущему каталогу:

find . -type d -maxdepth 1 -mindepth 1

Так как Вы не делаете этого рекурсивно, можно использовать шарик удара:

echo */

Добавление запаздывания / к шарику заставит только каталоги быть согласованными.

9
27.01.2020, 19:36
  • 1
    */ промахи отмечают точкой файлы, и включает символьные ссылки. Это может или не может быть проблемой. –  Gilles 'SO- stop being evil' 25.08.2012, 02:18
  • 2
    @Gilles - Это будет всегда пропускать символьные ссылки, но dotfiles зависит от того, установлен ли dotglob. –  jordanm 25.08.2012, 03:16

Я обычно использую:

find * -type d

Но я не знаю - ли это правильный способ сделать то, что Вы хотите.

2
27.01.2020, 19:36
  • 1
    Если Вы собираетесь позволить оболочке развернуть все имена файлов, почему использование находит вообще? –  jordanm 24.08.2012, 19:14
  • 2
    @jordanm Для выбора только каталогов. echo */ сделал бы то же самое, более или менее (оно пропускает точечные файлы и включает символьные ссылки), но затем joachim спросил бы, как удалить финал /. –  Gilles 'SO- stop being evil' 25.08.2012, 02:17

Позволить sed удалите те два символа:

find . -maxdepth 1 -type d | sed -e 's/^\.\///'
6
27.01.2020, 19:36

Я использовал бы:

 find ./ -type d -maxdepth 1 -exec basename {} \;
6
27.01.2020, 19:36

В AIX параметр maxdepth не работает.

В общем, у меня работает:

find ./ -type d | вырезать -d "/" -f2 | sort -u

0
27.01.2020, 19:36

То, что вы ищете, называется basename, оно игнорирует структуру каталогов unix

Пример ниже:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

это исключит из вывода даже путь dir, устраняя необходимость cd перед запуском команды


Некоторая дополнительная информация:

Я бы передал -exec в качестве аргумента для find вместо | (pipe) другой команды для вывода (избегая второй команды, перебирающей каждую строку вывода, при этом, в зависимости от вывода, это может улучшить производительность скрипта)

ПРИМЕЧАНИЕ: find опции являются не позиционными (-maxdepth влияет на тесты, указанные до нее, а также на тесты, указанные после нее).

0
27.01.2020, 19:36

Теги

Похожие вопросы