Bash – Recursively create empty file in empty sub-directories

bashcommand line

I have created the directory structure for my Maven project.

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

7 directories, 2 files

Now I'd like to persist the structure to .git, which requires creating dummy files in sub-directories. How can I (recursively) add empty .gitkeep files to all empty sub-directories?


Following questions already discuss (recursive) creation of empty files in sub-directories, but I'd like the files to be created only in leaf directories and not in any intermediate directories

Best Answer

From Ryan Armstrong's blog, here's how you do it

find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;
  • find . -type d (recursively) looks for directories under current path
  • -empty filters out directories that already contain something
  • -not -path "./.git/*" ensures no files are created inside .git directory
  • -exec touch {}/.gitkeep \; creates empty .gitkeep file in each directory matching above criteria

The resulting structure looks like

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

7 directories, 7 files