Você parece tratar *.o e *.hi como algum tipo de filtro usado por mv . Não é assim que funciona. A ferramenta espera caminhos. Seu shell pode expandir *.o e *.hi para todos os caminhos locais adequados a partir do diretório atual; se funcionasse, mv veria caminhos, não padrões. Aparentemente você não tem arquivos correspondentes, então esses padrões não são expandidos e chegam a mv como eles são, portanto
mv: cannot stat '*.o': No such file or directory
etc.
Essa sintaxe pode funcionar:
mv ./src/*.o ./src/*.hi ./obj/
Ainda assim, falhará (um pouco) se não houver arquivos correspondentes em ./src . Você pode introduzir variáveis como você fez, mas
- você provavelmente não precisa de
$(pwd) , srcpath="./src" deve ser suficiente;
-
em geral, você deve citar suas variáveis (mas não os padrões), por exemplo:
mv "$srcpath"/*.o "$srcpath"/*.hi "$objpath"
Se houver muitos arquivos, você alcançará argument list too long .
Esta solução alternativa usando find deve funcionar com um grande número de arquivos ou nenhum arquivo:
find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv {} "$objpath" \;
Veja man 1 find para saber como o -exec funciona. Observe também que, graças às aspas, strings como "*.o" não são expandidas pelo shell aqui; find os obtém literalmente e usa seu procedimento de correspondência de padrões intrínsecos.
A solução executará um mv separado para cada arquivo. Podemos passar muitos argumentos para mv graças à sintaxe find … -exec … {} + , mas como a sintaxe exige que esses argumentos estejam no final, precisamos de mv para suportar -t (isso não é exigido pelo POSIX, então sua mv pode ou não suportá-lo):
find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv -t "$objpath" {} +