Flatten/Compress ZSH 中的深层嵌套目录
Flatten/Compress deeply nested directories in ZSH
我正在处理很多 Java 项目,Java 中的标准是具有以下目录结构:
▶ tree src
src
├── androidTest
│ └── java
│ └── com
│ └── mypackage
│ └── example
│ └── ExampleInstrumentedTest.kt
├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ └── mypackage
│ │ └── example
│ │ └── MainActivity.kt
│ └── res
│
│
└── test
└── java
└── com
└── mypackage
└── example
└── ExampleUnitTest.kt
使用命令行处理它真的很痛苦,因此,大多数 IDE 都有一个“扁平化功能”来将目录显示为 com.mypackage.example
而不是 com > mypackage > example
. Even GitHub has this feature.
有没有一种方法可以将一些深层嵌套的目录显示为一层,以便可以使用 cd com.mypackage.example
而不是 cd java/com/mypackage/example
访问它并返回 cd ..
而不是的 cd ../../../..
?
我发现 this reddit post 这可能有用,但在我尝试时它并没有解决我的问题
您可以在 cd
周围放置一个包装函数,如下所示:
cd() {
# If we don't have exactly one argument that is a valid dir...
if ! [[ $# -eq 1 && -d $PWD/ ]]; then
# ...then just use the default behavior.
builtin cd "$@"
return
fi
# Get the absolute path of where normal `cd <arg1>` would take us.
local dir=${${:-$PWD/}:A}
# List the children of that dir.
local -a children=( $dir/* )
if [[ == '..' ]]; then
# Keep going up until we find a dir with more than one child.
while [[ $#dir -gt 1 && $#children -eq 1 ]]; do
dir=$dir:h
children=( $dir/* )
done
else
# Keep going down as long as we find exactly one child and it's a dir.
while [[ $#children -eq 1 && -d $children ]]; do
dir=$children
children=( $dir/* )
done
fi
# Pass the resulting path to `cd`.
builtin cd $dir
}
您可以按如下方式使用它:
% pwd
/[...]/src/main
% ls
java/ res/
% cd java
% pwd
/[...]/src/main/java/com/mypackage/example
% cd ..
% pwd
/[...]/src/main
最后,如果您想要源代码树的平面文件列表,请使用:
% print -lo **(T^F)
src/androidTest/java/com/mypackage/example/ExampleInstrumentedTest.kt
src/main/java/com/mypackage/example/MainActivity.kt
src/main/res/
src/test/java/com/mypackage/example/ExampleUnitTest.kt
print -l
在单独的行中列出每个项目。
print -o
对项目进行升序排序。
**
进行递归通配。
(T)
添加文件类型标记(/
用于目录,@
用于符号链接等)
(^F)
匹配任何 除了 带有子目录(“完整”目录)的目录。
我正在处理很多 Java 项目,Java 中的标准是具有以下目录结构:
▶ tree src
src
├── androidTest
│ └── java
│ └── com
│ └── mypackage
│ └── example
│ └── ExampleInstrumentedTest.kt
├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ └── mypackage
│ │ └── example
│ │ └── MainActivity.kt
│ └── res
│
│
└── test
└── java
└── com
└── mypackage
└── example
└── ExampleUnitTest.kt
使用命令行处理它真的很痛苦,因此,大多数 IDE 都有一个“扁平化功能”来将目录显示为 com.mypackage.example
而不是 com > mypackage > example
. Even GitHub has this feature.
有没有一种方法可以将一些深层嵌套的目录显示为一层,以便可以使用 cd com.mypackage.example
而不是 cd java/com/mypackage/example
访问它并返回 cd ..
而不是的 cd ../../../..
?
我发现 this reddit post 这可能有用,但在我尝试时它并没有解决我的问题
您可以在 cd
周围放置一个包装函数,如下所示:
cd() {
# If we don't have exactly one argument that is a valid dir...
if ! [[ $# -eq 1 && -d $PWD/ ]]; then
# ...then just use the default behavior.
builtin cd "$@"
return
fi
# Get the absolute path of where normal `cd <arg1>` would take us.
local dir=${${:-$PWD/}:A}
# List the children of that dir.
local -a children=( $dir/* )
if [[ == '..' ]]; then
# Keep going up until we find a dir with more than one child.
while [[ $#dir -gt 1 && $#children -eq 1 ]]; do
dir=$dir:h
children=( $dir/* )
done
else
# Keep going down as long as we find exactly one child and it's a dir.
while [[ $#children -eq 1 && -d $children ]]; do
dir=$children
children=( $dir/* )
done
fi
# Pass the resulting path to `cd`.
builtin cd $dir
}
您可以按如下方式使用它:
% pwd
/[...]/src/main
% ls
java/ res/
% cd java
% pwd
/[...]/src/main/java/com/mypackage/example
% cd ..
% pwd
/[...]/src/main
最后,如果您想要源代码树的平面文件列表,请使用:
% print -lo **(T^F)
src/androidTest/java/com/mypackage/example/ExampleInstrumentedTest.kt
src/main/java/com/mypackage/example/MainActivity.kt
src/main/res/
src/test/java/com/mypackage/example/ExampleUnitTest.kt
print -l
在单独的行中列出每个项目。print -o
对项目进行升序排序。**
进行递归通配。(T)
添加文件类型标记(/
用于目录,@
用于符号链接等)(^F)
匹配任何 除了 带有子目录(“完整”目录)的目录。