有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java展平/压缩ZSH中的深度嵌套目录

我正在处理许多Java项目,Java的标准是具有以下目录结构:

▶ tree src
src
├── 安卓Test
│   └── 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 > exampleEven GitHub has this feature

有没有一种方法可以将一些像这样的深度嵌套目录显示为一级深度,这样就可以使用cd com.mypackage.example而不是cd java/com/mypackage/example来访问它,并使用cd ..而不是cd ../../../..返回

我发现this reddit post可能有用,但当我尝试它时,它并没有解决我的问题


共 (1) 个答案

  1. # 1 楼答案

    可以在cd周围放置一个包装函数,如下所示:

    cd() {
      # If we don't have exactly one argument that is a valid dir...
      if ! [[ $# -eq 1 && -d $PWD/$1 ]]; 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/$1}:A}
    
      # List the children of that dir.
      local -a children=( $dir/* )
    
      if [[ $1 == '..' ]]; 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)匹配任何项,除了带孩子的目录(“完整”目录)