在所有空的“leaf”子目录中递归创建空文件

在所有空的“leaf”子目录中递归创建空文件

Maven我已经为我的项目创建了目录结构。

$ tree -a -I .git
.
├── .gitignore
├── README.md
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   └── resources
    └── test
        ├── java
        └── resources

7 directories, 2 files

现在我想将结构持久化到.git,这需要创建虚拟文件在子目录中。我如何(递归地)将空.gitkeep文件添加到所有空子目录


以下问题已经讨论了在子目录中(递归)创建空文件,但我想要只能在以下位置创建的文件叶目录并且不在任何中间目录

答案1

瑞安·阿姆斯特朗的博客,这是使用 GNUfind或兼容版本执行此操作的方法:

find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;
  • find . -type d(递归)查找当前路径下的目录
  • -empty过滤掉已经包含某些内容的目录
  • -not -path "./.git/*".git确保目录内没有创建文件
  • -exec touch {}/.gitkeep \;.gitkeep在符合上述条件的每个目录中创建空文件

结果结构看起来像

$ tree -a -I .git
.
├── .gitignore
├── README.md
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── .gitkeep
    │   └── resources
    │       └── .gitkeep
    └── test
        ├── java
        │   └── .gitkeep
        └── resources
            └── .gitkeep

7 directories, 7 files

答案2

使用 zsh:

() {touch -- $^@/.gitkeep} **/*(/^F)

在哪里:

  • **/:任意数量(包括 0)的子目录(递归全局)。请注意,默认情况下会忽略隐藏的文件和目录。
  • (/^F): 全局限定符:
    • /: 文件类型目录
    • ^F: 不全F(空)
  • {} {body} arguments:匿名函数:
  • $^@$@启用rc_expand_param后,它会扩展为与...$^@/.gitkeep相同,而不是... ,否则会这样做。$1/.gitkeep $2/.gitkeep$n/.gitkeep$1 $2$n/.gitkeep

相关内容