Анализ структуры папок с $ HOME в имени

В течение некоторого времени у меня есть две функции pathadd и pathrm , которые помогают добавлять элементы в путь, не беспокоясь о дублировании.

pathadd принимает единственный аргумент пути и необязательный после аргумента , который, если он указан, будет добавлен к PATH , в противном случае он добавит его в начало.

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

pathadd() {
    newelement=${1%/}
    if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then
        if [ "$2" = "after" ] ; then
            PATH="$PATH:$newelement"
        else
            PATH="$newelement:$PATH"
        fi
    fi
}

pathrm() {
    PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e 's;^:\|:$;;g' -e 's;::;:;g')"
}

Поместите их в любой сценарий, который вы хотите изменить среду PATH, и теперь вы можете это сделать.

pathadd "/foo/bar"
pathadd "/baz/bat" after
export PATH

Вы гарантированно не добавите к пути, если он уже есть. Если теперь вы хотите убедиться, что / baz / bat находится в начале.

pathrm "/baz/bat"
pathadd "/baz/bat"
export PATH

Теперь любой путь можно переместить на передний план, если он уже находится на пути, без дублирования.

0
23.04.2019, 17:53
1 ответ

Некоторые подсказки:

  • Используйте evalдля интерпретации переменной.
  • Не зацикливайтесь на результатах find, а используйте find -exec.
  • Использовать удаление подстроки bashвместо cut.
  • Используйте rsyncвместо cp.
  • Создать каталоги перед копированием.
find backup -type f -exec sh -c '
    mkdir -p "$(eval dirname "${1#*/}")";
    rsync -av "$1" "$(eval printf "${1#*/}")"
' find-sh {} \;

Или лучше просто используйте rsyncв первую очередь, что делает именно то, что вы хотите:

rsync -av backup/\$HOME/ $HOME/
0
28.01.2020, 03:47

Теги

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