Проще говоря, vm - это полноценная ОС с множеством вещей, в которых вы не нуждаетесь, в то время как контейнеры буквально являются контейнерами для любых служб (обычно одной службы на контейнер), которые вам нужны. Из-за этого легче масштабировать. Другие преимущества приходят с этим основным.
В конце Вашего сценария, помещенного строка:
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
только проверки базовое имя файла, не имя полного пути.
Если действительно необходимо идти по этой дороге, Вы могли бы попытаться минимизировать, который СОЕДИНЯЕТ КАНАЛОМ, перечисляют еще немного: папки отбрасывания, которые не содержат исполняемых файлов. Конечно, за счет еще большего количества статистики.; - /
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/:$//'
Следующее Делает Правильную Вещь, включая обрезку скрытых каталогов и их детей и правильно обработки имен с новыми строками или другим пробелом:
export PATH="${PATH}$(find ~/code -name '.*' -prune -o -type d -printf ':%p')"
я использую подобный прием для автоматически установки CLASSPATH
s.
Что-то как
my_path=$(find $root -type d | tr '\n' ':')
или
my_path=$(find $root -type d -printf '%p:')
В ударе 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', обеспечивает. Если Вы намеревались использовать находку + 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
Что-то вроде этого:
_path="$(
find <path> -name '.*' -prune -o -type d -print
)"
[[ $_path ]] && _path="${_path//$'\n'/:}" PATH="$PATH:${_path%:}"
Если у Вас есть GNU, находят, что можно использовать -printf ':%p'
непосредственно.
У меня есть сингл bin
каталог $HOME/bin
, и это получает установленную копию любых программ, которые я создаю (или сценарии или символьные ссылки на программы или сценарии). Это в настоящее время имеет почти 600 команд в нем (ls | wc -l
, говорит 604, но существует приблизительно дюжина подкаталогов по различным причинам).
, Когда я тестирую программу, я выполняю ее, где я создаю ее; как только я сделал тестирование в настоящее время, я acquire
это с моим acquire
сценарий, который копирует файл и устанавливает полномочия на нем.
Это оставляет меня с хорошим опрятным профилем (я не использую .bashrc
; я сделал бы установку однажды, когда оболочка входа в систему запускается, и подоболочки наследовали рабочую среду, не имея необходимость анализировать .bashrc
снова), но довольно неловкое bin
каталог. Это избегает стоимости сброса ПУТИ каждый раз, когда оболочка запускается, например, и данный, насколько сложный мой устанавливающий путь код, который является точно также!