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
2 Answers 2
From Ryan Armstrong's blog, here's how you do it with GNU find
or compatible:
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
With zsh:
() {touch -- $^@/.gitkeep} **/*(/^F)
Where:
**/
: any amount (including 0) of subdirectories (recursive globing). Note that hidden files and directories are ignored by default.(/^F)
: glob qualifiers with:/
: files of type directory^F
: notF
ull (empty)
{} {body} arguments
: anonymous functions:$^@
:$@
withrc_expand_param
enabled so that$^@/.gitkeep
expands to the same as1ドル/.gitkeep
2ドル/.gitkeep
...$n/.gitkeep
instead of1ドル
2ドル
...$n/.gitkeep
as it would do otherwise.