For loops with find are evil for a lot of reasons, one of which is spaces:
$ tree
.
├── arent good with find loops
│ ├── a
│ └── innerdira
│ └── docker-compose.yml
└── dirs with spaces
├── b
└── innerdirb
└── docker-compose.yml
3 directories, 2 files
$ for y in $(find .); do echo $y; done
.
./are
t good with fi
d loops
./are
t good with fi
d loops/i
erdira
./are
t good with fi
d loops/i
erdira/docker-compose.yml
./are
t good with fi
d loops/a
./dirs with spaces
./dirs with spaces/i
erdirb
./dirs with spaces/i
erdirb/docker-compose.yml
./dirs with spaces/b
You can kinda fix that with IFS (this breaks if newlines are in the filename which would probably only happen in a malicious context):
$ OIFS=$IFS
$ IFS=$'\n'
$ for y in $(find .); do echo "$y"; done
.
./arent good with find loops
./arent good with find loops/innerdira
./arent good with find loops/innerdira/docker-compose.yml
./arent good with find loops/a
./dirs with spaces
./dirs with spaces/innerdirb
./dirs with spaces/innerdirb/docker-compose.yml
./dirs with spaces/b
$ IFS=$OIFS
But you can also use something like:
find . -name 'docker-compose.yml' -printf '%h\0' | while read -r -d $'\0' dir; do
....
done
or in your case this could all be done from find
alone:
find . -name 'docker-compose.yml' -execdir ...
-execdir
in this case is basically replacing your cd $(dirname $y)
, which is also brittle when it comes to spaces and should be quoted: cd "$(dirname "$y")"
.
Look at this person over here using branches, show off