Trouver et déplacer tous les fichiers tout en conservant les répertoires intacts

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" {} \; 

J’ai le code ci-dessus qui trouve des fichiers et essaie ensuite de préserver la structure du répertoire. Mais le problème est qu’il ne trouve pas et ne déplace pas tous les fichiers du type que j’ai demandé – qu’est-ce qui ne va pas? Il semble manquer des fichiers qui ne sont pas au niveau de répertoire le plus bas.

 Source/ \->File (misses this) \->Folder/ \->File (finds/moves this) 

-o a une préséance inférieure à celle implicite -a entre les expressions adjacentes, et ainsi de suite

find . -name '*.ext1' -o -name '*.ext2' -exec blah

sera analysé comme

find . '(' -name '*.ext1' ')' -o '(' -name '*.ext2' -exec blah ')' find . '(' -name '*.ext1' ')' -o '(' -name '*.ext2' -exec blah ')' .

Pour obtenir ce que vous voulez, faites:

 find . '(' -name '*.ext1' -o -name '*.ext2' ')' -exec sh -c ' mkdir -p "$0/${1%/*}" mv "$1" "$0/$1" ' "$destination" {} \;