Как рекурсивно добавить подкаталоги к ПУТИ?

Проще говоря, vm - это полноценная ОС с множеством вещей, в которых вы не нуждаетесь, в то время как контейнеры буквально являются контейнерами для любых служб (обычно одной службы на контейнер), которые вам нужны. Из-за этого легче масштабировать. Другие преимущества приходят с этим основным.

21
задан nbro 2 September 2018 в 19:54
поделиться

7 ответов

В конце Вашего сценария, помещенного строка:

PATH=${PATH}:$(find ~/code -type d | tr '\n' ':' | sed 's/:$//')

Это добавит каждый каталог в Вашем ~/, кодируют дерево к текущему пути. Мне не нравится идея самому, предпочитая иметь только несколько каталогов, содержащих мои собственные исполняемые файлы и явно перечисляющих их, но каждому их собственное.

, Если Вы хотите исключить все каталоги, которые скрыты, в основном необходимо разделить каждую строку, которая имеет последовательность "/." (чтобы гарантировать, чтобы Вы не проверяли подкаталоги в соответствии со скрытыми каталогами также):

PATH=${PATH}:$(find ~/code -type d | sed '/\/\\./d' | tr '\n' ':' | sed 's/:$//')

Это будет мешать Вам получить каталоги такой как ~/code/level1/.hidden/level3/ (т.е. это прекращает искать в поддеревьях, как только это обнаруживает, они скрыты). Если Вы только хотите не пустить скрытые каталоги, но все еще позволить нескрытые каталоги под ними, используйте:

PATH=${PATH}:$(find ~/code -type d -name '[^\.]*' | tr '\n' ':' | sed 's/:$//')

Это позволило бы ~/code/level1/.hidden2/level3/, но запретило бы ~/code/level1/.hidden2/.hidden3/ с тех пор -name только проверки базовое имя файла, не имя полного пути.

22
ответ дан 29 November 2019 в 20:17
поделиться

Если действительно необходимо идти по этой дороге, Вы могли бы попытаться минимизировать, который СОЕДИНЯЕТ КАНАЛОМ, перечисляют еще немного: папки отбрасывания, которые не содержат исполняемых файлов. Конечно, за счет еще большего количества статистики.; - /

PATH=$PATH$(find ~/code -name '.*' -prune -o -type f -a -perm /u+x -printf ':%h\n' | sort | uniq | tr -d '\n')

я постарался бы не делать это в каждой икре оболочки. Некоторое кэширование должно использоваться. Например, добавьте эту строку к своему ~/.bashrc:

[ -s ~/.codepath ] && export PATH=$PATH$(<~/.codepath)

и выполненный

find ~/code -name '.*' -prune -o -type f -a -perm /u+x -printf ':%h\n' |sort |uniq |tr -d '\n' > ~/.codepath

только, когда Вы знаете, что-то действительно изменилось.

РЕДАКТИРОВАНИЕ: вот перезапись без Вашего недостающего-printf

find ~/code -name '.*' -prune -o -type f -a -perm /u+x -print | sed 's@/[^/]\+$@:@' | sort | uniq | tr -d '\n' | sed 's/^/:/; s/:$//'
2
ответ дан 29 November 2019 в 20:17
поделиться

Следующее Делает Правильную Вещь, включая обрезку скрытых каталогов и их детей и правильно обработки имен с новыми строками или другим пробелом:

export PATH="${PATH}$(find ~/code -name '.*' -prune -o -type d -printf ':%p')"

я использую подобный прием для автоматически установки CLASSPATH s.

18
ответ дан 29 November 2019 в 20:17
поделиться

Что-то как

my_path=$(find $root -type d | tr '\n' ':')

или

my_path=$(find $root -type d -printf '%p:')
2
ответ дан 29 November 2019 в 20:17
поделиться

В ударе 4.0 можно просто использовать недавно поддерживаемый ** оператор.

необходимо включить его сначала на некоторых с:

shopt -s globstar

можно тогда сделать

echo ** 

, которого рекурсивно echos все файлы, которые являются потомком текущего dir

, Остерегаются, он действительно имеет тенденцию прыгать с парашютом на чрезмерно сложных директорах иногда, так используйте ** в самой низкой точке recucurring.

echo **/  

По совпадению, испускает рекурсивно все имена каталогов и только имена каталогов. (Исключая текущий dir)

echo ./**/ 

Включает текущий dir (Кстати, он также пропускает скрытые каталоги)

, Это должно thuswise подойти для создания строки пути:

echo ./**/ | sed 's/\s\s*/:/g'

И если Вы не хотите относительных путей,

echo $PWD/**/ | sed 's/\s\s*/:/g' 

Ack

Из Вашего комментария к одному из других сообщений, он кажется на желание поведения во многом как 'Ack', обеспечивает. Если Вы намеревались использовать находку + grep комбинация, этот инструмент обычно намного более эффективен и легче использовать для этой задачи.

:

# search for 'mystring' in all c++ files recursively ( excluding SCM dirs and backup files ) 
ack  "mystring" --type=cpp 

# finds all text files not in an SCM dir ( recursively) and not a backup using type heuristics. 
ack -f --type=text  
1
ответ дан 29 November 2019 в 20:17
поделиться

Что-то вроде этого:

_path="$(
  find <path> -name '.*' -prune -o -type d -print
  )" 

[[ $_path ]] && _path="${_path//$'\n'/:}" PATH="$PATH:${_path%:}"   

Если у Вас есть GNU, находят, что можно использовать -printf ':%p' непосредственно.

0
ответ дан 29 November 2019 в 20:17
поделиться

У меня есть сингл bin каталог $HOME/bin, и это получает установленную копию любых программ, которые я создаю (или сценарии или символьные ссылки на программы или сценарии). Это в настоящее время имеет почти 600 команд в нем (ls | wc -l, говорит 604, но существует приблизительно дюжина подкаталогов по различным причинам).

, Когда я тестирую программу, я выполняю ее, где я создаю ее; как только я сделал тестирование в настоящее время, я acquire это с моим acquire сценарий, который копирует файл и устанавливает полномочия на нем.

Это оставляет меня с хорошим опрятным профилем (я не использую .bashrc; я сделал бы установку однажды, когда оболочка входа в систему запускается, и подоболочки наследовали рабочую среду, не имея необходимость анализировать .bashrc снова), но довольно неловкое bin каталог. Это избегает стоимости сброса ПУТИ каждый раз, когда оболочка запускается, например, и данный, насколько сложный мой устанавливающий путь код, который является точно также!

0
ответ дан 29 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

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