在测试环境中,我们的日志文件目录结构如下所示:
/var/Logs/int/app-id/region-code/log/file-name.log
/var/Logs/sat/app-id/region-code/log/file-name.log
/var/Logs/cat/app-id/region-code/log/file-name.log
每个环境有许多应用程序 ID,每个应用程序 ID 有多个区域代码(取决于应用程序)。
是否有一个命令可以让我将目录从 int 更改为 sat,并保持路径的所有其余部分相同?像下面这样:
$ pwd
/var/Logs/int/abc/01/log
$ cdswap int sat
$ pwd
/var/Logs/sat/abc/01/log
$ cdswap abc def
$ pwd
/var/Logs/sat/def/01/log
如果这也有效,那就太好了:
$ cdswap def/01 ghi/02
$ pwd
/var/Logs/sat/ghi/02/log
如果没有这样的命令,我可以设置一个别名来有效地执行相同的操作吗?那看起来怎么样?
感谢您的帮助!
答案1
在 zsh 中,cdswap
是cd
...。当给定两个参数时,cd
将当前目录中的第一个参数替换为第二个参数,并更改为结果目录。
您可以通过创建cd
一个函数在 bash 中模拟这一点。
cd () {
local i=1
while [[ "${!i}" = -* ]]; do ((++i)); done
if ((i == $# - 1)); then
local operands
operands=("$@")
operands[$i]=${PWD/${!i}/${!#}}
if [[ "${operands[$i]}" == "$PWD" ]]; then
echo >&2 "cd: string not in pwd: ${operands[$i]}"
return 1
fi
set -- "${operands[@]:$(($#-1))}"
fi
builtin cd "$@"
}
答案2
如果你使用bash
这个 shell 函数应该做你想做的事。pwd;
如果您不希望新目录位置的可见更新,请删除。
cdswap() { cd "${PWD/$1/$2}"; pwd; }
例子
$ cd /usr/local/src
$ pwd
/usr/local/src
$ cdswap src bin
/usr/local/bin
$ pwd
/usr/local/bin
$ cdswap local/bin src
/usr/src
答案3
尝试使用以下方法:
cd $(echo $PWD | sed 's/abc/def/')
将这些命令设置为别名,然后您就可以开始比赛了。
您还可以将其设为一个函数,以便可以交换要交换的文件。
function cdswap() {
cd $(echo $PWD | sed 's/$1/$2/')
}
然后将该函数放入您的 .bash_profile 中