linux 终端中目录之间的快速智能导航
quick and smart navigation between directories in the linux terminal
我正在处理具有相似结构和子目录的多个项目。层次结构的一个例子是这样的:
其中X是项目名,子目录Main
、Libs
、Lx
和Mx
对于不同的项目都是一样的。 insteding cd'ing betweeing ong paths,我想创建一个别名(或一个简单的命令)来跳转到一个目录(例如:Libs/ M2
),而不管我所在的项目名称和子目录(无论我在L1
还是L8
,还是project_red
还是project_yellow
,我都想跳到M2
。
这很容易通过为单个项目创建别名来实现:
alias goM2='cd /projects/project_red/Libs/M1/M2'
但我不确定如何为所有不同的项目名称执行此操作。我可以创建多个别名,但我想知道是否有一种巧妙的方法可以做到这一点。也许通过解析当前目录来提取项目名称并在末尾添加所需的目标,但我不确定该怎么做。
谢谢
如果各种 L1、L2、M1、M2 都是不同的名称,您可以将目录路径集合添加到 CDPATH 环境变量(而不是创建别名)。该功能已被讨论多次,例如,。 How to make a custom BASH function to cd into a certain directory with autocomplete
在同一个项目中的目录之间移动(假设 Main
和 Libs
是项目根目录的唯一直接子级)类似这个功能应该可以工作。
projcd() {
projdir=$PWD # Save current directory.
projdir=${projdir%/Main/*} # Pull off anything after "Main"
projdir=${projdir%/Libs/*} # Pull off anything after "Libs"
# Find the target directory by name (more than one match will fail later).
tgt=$(find "$projdir" -name "")
if [ -z "$tgt" ]; then
echo "No directory found for ." >&2
exit 1
fi
relpath=$(sed -e 's#[^/]\+/\?#../#g' <<<"${PWD#$projdir/}")
cd "$relpath/$tgt"
}
alias subfolder name=" eval $\"cd /from root to projects folder path/` pwd | cut -d'/' -fn`/sub folder path into the
respective project\""
1)eval 命令接受参数并构造它的命令。
2)密码 | cut -d'/' -fn 用于获取当前项目名称。子文件夹路径名和根到项目文件夹路径是常量 here.n 表示项目文件夹从根目录开始的顺序
3) 每次为子文件夹执行别名时,它会获取当前项目名称并将其连接到根目录到项目文件夹路径和子文件夹路径名称以及 cd 命令,然后执行。
在你的例子中命令是
例如:Libs 文件夹
别名 Libs=" eval $\"cd /projects/\` pwd | cut -d'/' -f3\`/Libs\""
如果每个项目的子结构都相同(仅在 libs 和 mains under Libs
的数量上有所不同和 Main
目录),假设您的项目目录位于 $HOME
目录下,并且 项目目录树 如下所示:
projects/
|-- project1
| |-- Libs
| | |-- M1
| | |-- M2
| | `-- M3
| `-- Main
| |-- L1
| |-- L2
| `-- L3
`-- project2
|-- Libs
| |-- M1
| |-- M2
| `-- M3
`-- Main
|-- L1
|-- L2
`-- L3
一个函数(在您的配置文件或您在 bash 会话期间用于加载的任何库中声明)如下 _go_to_project_dir
将按需要完成工作。
当然有些变量只是一个解释性的目的,根据你的文件系统层次结构做了很多假设。
_go_to_project_dir() {
local projects_HOME="$HOME/projects" # this could be configured as needed
local current_project_dir # this is only an auxiliar variable
printf -v current_project_dir "%b" "${PWD%%/[(Libs)(Main)]*}" # printf -v will store the formated message into the variable following -v option
# '%%' will remove the longest occurrence of the following pattern '/[(Libs)(Main)]*'
# from the 'PWD' variable using pathname expansion
local current_project_name
printf -v current_project_name "%b" "${current_project_dir#${projects_HOME}/}" # '#' will remove shortest occurrence of the following pattern
# '${projects_HOME}/' from the 'current_project_dir' variable
# using pathname expansion
local dir_name="" # Directory where you want to go
local project_name="${2-$current_project_name}" # this will store second parameter if provided or 'current_project_name' content elsewhere
local dir_type="${dir_name:0:1}" # this will extract the first character from your directory name but you could select a different length to match your actual pattern names
case ${dir_type} in # here we select the path according to the previously extracted directory type
M )
path_to_go="${projects_HOME}/${project_name}/Libs/${dir_name}"
;;
L )
path_to_go="${projects_HOME}/${project_name}/Main/${dir_name}"
;;
esac
cd "${path_to_go}" # And it's done
}
当然,您可以根据您的目录名称模式以一些不同的方式提取 dir_type
,但核心思想保持不变。
如果基本功能不够用,您可以尝试https://pypi.org/project/fastcd并配置快捷方式
我正在处理具有相似结构和子目录的多个项目。层次结构的一个例子是这样的:
其中X是项目名,子目录Main
、Libs
、Lx
和Mx
对于不同的项目都是一样的。 insteding cd'ing betweeing ong paths,我想创建一个别名(或一个简单的命令)来跳转到一个目录(例如:Libs/ M2
),而不管我所在的项目名称和子目录(无论我在L1
还是L8
,还是project_red
还是project_yellow
,我都想跳到M2
。
这很容易通过为单个项目创建别名来实现:
alias goM2='cd /projects/project_red/Libs/M1/M2'
但我不确定如何为所有不同的项目名称执行此操作。我可以创建多个别名,但我想知道是否有一种巧妙的方法可以做到这一点。也许通过解析当前目录来提取项目名称并在末尾添加所需的目标,但我不确定该怎么做。
谢谢
如果各种 L1、L2、M1、M2 都是不同的名称,您可以将目录路径集合添加到 CDPATH 环境变量(而不是创建别名)。该功能已被讨论多次,例如,。 How to make a custom BASH function to cd into a certain directory with autocomplete
在同一个项目中的目录之间移动(假设 Main
和 Libs
是项目根目录的唯一直接子级)类似这个功能应该可以工作。
projcd() {
projdir=$PWD # Save current directory.
projdir=${projdir%/Main/*} # Pull off anything after "Main"
projdir=${projdir%/Libs/*} # Pull off anything after "Libs"
# Find the target directory by name (more than one match will fail later).
tgt=$(find "$projdir" -name "")
if [ -z "$tgt" ]; then
echo "No directory found for ." >&2
exit 1
fi
relpath=$(sed -e 's#[^/]\+/\?#../#g' <<<"${PWD#$projdir/}")
cd "$relpath/$tgt"
}
alias subfolder name=" eval $\"cd /from root to projects folder path/` pwd | cut -d'/' -fn`/sub folder path into the respective project\""
1)eval 命令接受参数并构造它的命令。
2)密码 | cut -d'/' -fn 用于获取当前项目名称。子文件夹路径名和根到项目文件夹路径是常量 here.n 表示项目文件夹从根目录开始的顺序
3) 每次为子文件夹执行别名时,它会获取当前项目名称并将其连接到根目录到项目文件夹路径和子文件夹路径名称以及 cd 命令,然后执行。
在你的例子中命令是
例如:Libs 文件夹
别名 Libs=" eval $\"cd /projects/\` pwd | cut -d'/' -f3\`/Libs\""
如果每个项目的子结构都相同(仅在 libs 和 mains under Libs
的数量上有所不同和 Main
目录),假设您的项目目录位于 $HOME
目录下,并且 项目目录树 如下所示:
projects/ |-- project1 | |-- Libs | | |-- M1 | | |-- M2 | | `-- M3 | `-- Main | |-- L1 | |-- L2 | `-- L3 `-- project2 |-- Libs | |-- M1 | |-- M2 | `-- M3 `-- Main |-- L1 |-- L2 `-- L3
一个函数(在您的配置文件或您在 bash 会话期间用于加载的任何库中声明)如下 _go_to_project_dir
将按需要完成工作。
当然有些变量只是一个解释性的目的,根据你的文件系统层次结构做了很多假设。
_go_to_project_dir() {
local projects_HOME="$HOME/projects" # this could be configured as needed
local current_project_dir # this is only an auxiliar variable
printf -v current_project_dir "%b" "${PWD%%/[(Libs)(Main)]*}" # printf -v will store the formated message into the variable following -v option
# '%%' will remove the longest occurrence of the following pattern '/[(Libs)(Main)]*'
# from the 'PWD' variable using pathname expansion
local current_project_name
printf -v current_project_name "%b" "${current_project_dir#${projects_HOME}/}" # '#' will remove shortest occurrence of the following pattern
# '${projects_HOME}/' from the 'current_project_dir' variable
# using pathname expansion
local dir_name="" # Directory where you want to go
local project_name="${2-$current_project_name}" # this will store second parameter if provided or 'current_project_name' content elsewhere
local dir_type="${dir_name:0:1}" # this will extract the first character from your directory name but you could select a different length to match your actual pattern names
case ${dir_type} in # here we select the path according to the previously extracted directory type
M )
path_to_go="${projects_HOME}/${project_name}/Libs/${dir_name}"
;;
L )
path_to_go="${projects_HOME}/${project_name}/Main/${dir_name}"
;;
esac
cd "${path_to_go}" # And it's done
}
当然,您可以根据您的目录名称模式以一些不同的方式提取 dir_type
,但核心思想保持不变。
如果基本功能不够用,您可以尝试https://pypi.org/project/fastcd并配置快捷方式