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) 匹配任何 除了 带有子目录(“完整”目录)的目录。