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" {} +