在 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 > exampleEven GitHub has this feature

有没有办法将一些像这样的深层嵌套目录显示为一层深度,以便可以使用 cd com.mypackage.example 而不是 cd java/com/mypackage/example 访问它,并返回 cd .. 而不是 { {1}} ?

我发现 this reddit post 可能很有用,但在我试用后并没有解决我的问题

解决方法

您可以在 const path = require("path") const TerserPlugin = require("terser-webpack-plugin") let isProduction = process.env.NODE_ENV === "production" const { CleanWebpackPlugin } = require("clean-webpack-plugin") module.exports = { entry: { "MyProject": "./src/index.js",},output: { path: path.resolve(__dirname,"dist"),filename: isProduction ? "[name].min.js" : "[name].js",plugins: [new CleanWebpackPlugin()],mode: isProduction ? "production" : "development",module: { rules: [{ test: /.js$/,exclude: /(node_modules)/,use: { loader: "babel-loader",options: { plugins: ["@babel/plugin-transform-modules-commonjs"],{ test: /.css$/i,use: [ { loader: "style-loader",options: { injectType: "linkTag" } },"file-loader",],...(isProduction ? {} : { devtool: "eval-source-map" }),optimization: { minimize: true,minimizer: [new TerserPlugin()],} 周围放置一个包装函数,如下所示:

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) 表示目录,/ 表示符号链接等)
  • @ 匹配任何除了带有子目录的目录(“完整”目录)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...