diff options
| author | Matthijs van der Wild <matthijs@vanderwild.com> | 2026-03-13 14:16:39 +0000 |
|---|---|---|
| committer | Matthijs van der Wild <matthijs@vanderwild.com> | 2026-03-13 14:16:39 +0000 |
| commit | 04f201dc7d286c31bf6fb3ec94b52e06c28a5c18 (patch) | |
| tree | 4dd0bc11c3d7d033b62927c1a87948a7d94de283 | |
| parent | d2e2ab4347202d0ef0ecaaa6a634f24ee21815e5 (diff) | |
Publish input directory recursively
I want to have some control over how the input directory is processed.
publish() takes the input directory and scans its immediate contents.
Files are copied to the output directory, and publish is applied to
the subdirectories again.
I added the convention that, if a subdirectory starts with an
underscore, the contents are to be copied to the .well-known
directory instead. The contents are assumed to be files and the script
will fail if it contains a subdirectory.
I have added a limit to how deep the script will recurse into the input
directory. This is currently not exposed to the user.
| -rwxr-xr-x | publish.sh | 29 |
1 files changed, 26 insertions, 3 deletions
@@ -8,6 +8,29 @@ OUTDIR=${2} [ ! $# -eq 2 ] && echo "Usage: $0 <input dir> <output dir>" && exit 1 [ ! -d $INDIR ] && [ ! -d $OUTDIR ] && echo "Error: invalid input" && exit 1 -for dir in $(ls -d "$INDIR"/*/); do - cp -r $dir/* "$OUTDIR"/ -done +MAX_DEPTH=10 +publish() { + + [ $1 -gt $MAX_DEPTH ] && echo "Maximum depth exceeded." && exit 1 + + for file in $(find "$2" -maxdepth 1 -mindepth 1 -type f); do + cp $file $3/$(basename $file) + done + + for dir in $(find "$2" -maxdepth 1 -mindepth 1 -type d); do + dirname=$(basename $dir) + # If $dirname starts with an underscore the contents of + # $dir should be copied into the well-known directorie. + # It is assumed that $dir only contains files + if expr $dirname : "_"* 1> /dev/null; then + mkdir -p $OUTDIR/.well-known + cp $dir/* $OUTDIR/.well-known/ + else + output_dir=$3/$dirname + mkdir -p $output_dir + publish $(($1+1)) $dir $output_dir + fi + done +} + +publish 0 $INDIR $OUTDIR |