Vous semblez traiter *.oet *.hicomme une sorte de filtres utilisés par mv. Ce n'est pas comme ça que ça marche. L'outil attend des chemins. Votre shell peut développer *.oet *.hià tous les chemins d' accès locaux appropriés à partir du répertoire courant; si cela fonctionnait, mvverrait des chemins, pas des modèles. Apparemment, vous n’avez pas de fichiers correspondants, donc ces modèles ne sont pas développés et ne sont pas reproduits mvtels quels.
mv: cannot stat '*.o': No such file or directory
etc.
Ces syntaxes peuvent fonctionner:
mv ./src/*.o ./src/*.hi ./obj/
Néanmoins, il échouera (un peu) s’il n’ya pas de fichiers correspondants dans ./src. Vous pouvez introduire des variables comme vous l’avez fait, mais
- vous n'avez probablement pas besoin
$(pwd), srcpath="./src"devrait être suffisant;
en général, vous devriez citer vos variables (mais pas les motifs), par exemple:
mv "$srcpath"/*.o "$srcpath"/*.hi "$objpath"
S'il y a trop de fichiers, vous frapperez argument list too long.
Cette solution alternative utilisant finddevrait fonctionner avec un nombre élevé de fichiers ou aucun fichier:
find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv {} "$objpath" \;
Voir man 1 findpour apprendre comment ça -execmarche. Notez également que grâce aux guillemets, les chaînes comme "*.o"ne sont pas développées par le shell ici; findles obtient littéralement et utilise sa procédure de correspondance de modèle intrinsèque.
La solution sera exécutée séparément mvpour chaque fichier. Nous pouvons passer beaucoup d'arguments à mvgrâce à la find … -exec … {} +syntaxe, mais puisque la syntaxe exige que ces arguments soient à la toute fin, nous avons besoin mvde support -t(ce n'est pas requis par POSIX, donc vous mvpouvez ou non le supporter):
find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv -t "$objpath" {} +
extension0 $srcpath.....extensionN $srcpathN'y a-t-il aucun moyen de le faire[extension0...extensionN] $srcpath