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