Есть ли простой способ изменить каталоги из одной дублирующей структуры папок на другую?

Есть ли простой способ изменить каталоги из одной дублирующей структуры папок на другую?

На нашем сервере у нас есть несколько дублирующих структур папок для тестирования, подготовки и производства. За исключением незначительных изменений, структура папок у всех трех в целом одинакова.

Когда я работаю над плагином WordPress, я глубоко погружен в структуру папок разработки (например, ~/dev/com/wp-content/plugins/myplugin). Я знаю, что она ~/staging/com/wp-content/plugins/mypluginсуществует.

Если мой текущий рабочий каталог — ~/dev/com/wp-content/plugins/myplugin, могу ли я как-то легко переключиться на~/staging/com/wp-content/plugins/myplugin безвводить всю структуру каталогов?

Я хотел бы напечатать что-то вродеcdx~/staging, или дажеcdx../../../../../stagingи пусть команда попытается пройти вниз по новому каталогу, используя мой текущий путь к каталогу. Очевидно, если новая папка не содержит правильной структуры, она выдаст ошибку.

Мне придется вводить всю структуру каталогов? Или есть способ получше?

решение1

Используйте замену строк в bash:

$ a="~/dev/com/wp-content/plugins/myplugin"
$ echo ${a/dev/staging}
~/staging/com/wp-content/plugins/myplugin

Итак, функция типа:

cdx () 
{
    cd "${PWD/$1/$2}"
}

И затем сделать, cdx dev stagingчтобы переключиться из папки в devв staging. С некоторыми проверками, вы могли бы назвать функцию cd:

cd ()
{
    if [ $# != 2 ]
    then
        builtin cd "$@"
    else
        builtin cd "${PWD/$1/$2}"
    fi
}

Эффект:

~ # cd /tmp
/tmp # cd tmp srv
/srv # cd
~ # cd -
/srv
/srv # cd tmp var
/srv #

Это сохраняет обычное поведение cdво всех случаях, за исключением двух аргументов.

решение2

Добавьте эту функцию к своему файлу .bash_profile, и, набрав ее, cdstagingвы сможете переключаться между любым каталогом внутри него ~/devи его эквивалентом в ~/staging.

Конечно, вы можете изменить имя на то, что вам нужно. Кроме того, вы можете создать обратную функцию, просто изменив имя функции и "1s@dev@staging@"сделав ее прямо противоположной.

cdstaging ()
{
        OLDPATH=$(pwd | sed -e "1s@$HOME@~@")
        NEWPATH=$(echo $OLDPATH | sed -e "1s@dev@staging@")
        cd $NEWPATH
}

решение3

В kshили zsh:

cd dev staging

Связанный контент