Finding and moving all files while keeping directories intact
bash, mkdir, mv, unix
Solution
`-o` has lower precedence than the implied `-a` between adjacent expressions, and so
`find . -name '*.ext1' -o -name '*.ext2' -exec blah`
will be parsed as
`find . '(' -name '*.ext1' ')' -o '(' -name '*.ext2' -exec blah ')'`.
To get what you want, do:
find . '(' -name '*.ext1' -o -name '*.ext2' ')' -exec sh -c '
mkdir -p "$0/${1%/*}"
mv "$1" "$0/$1"
' "$destination" {} \;
Problem
``` read source read destination destination=$(cd -- "$destination" && pwd) cd -- "$source" && find . -name '*.ext1' -o -name '*.ext2' -exec sh -c ' mkdir -p "$0/${1%/*}" mv "$1" "$0/$1" ' "$destination" {} \; ``` I have the above code which finds files and then tries to preserve the directory structure. But the issue is it doesn't find and move all files over of the type I requested - what's wrong? It seems to miss files that aren't in the lowest directory level. ``` Source/ \->File (misses this) \->Folder/ \->File (finds/moves this) ```