Mover arquivos com extensão da origem para o destino

0

Olá, estou tentando mover todos os arquivos com a extensão .hi e .o de uma pasta de destino /src para outra pasta /Obj

Até agora eu tentei:

    srcpath=$(pwd)"/src"

    ghc src/Main.hs > Logs/output.txt 2> Logs/Err.txt //this builds the project and generates the binaries and .hi files

    mv  *.hi *.o  $srcpath/src/ Obj/     //i want to move all these files to Obj/ folder but where do i place the extension arguments? 

Como o comando deve ser: mv extensions source dest ? ou mv source dest extensions

Eu tentei:

srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"

ghc src/Company.hs > Logs/output.txt 2> Logs/Err.txt

mv *.o *.hi  $srcpath  $objpath

E recebo o seguinte erro:

    mv: cannot stat '*.o': No such file or directory
mv: cannot stat '*.hi': No such file or directory
mv: cannot move '/c/Users/[..]/src' to '/c/Users/[...]/Obj/src': Device or resource busy
    
por Bercovici Adrian 12.07.2018 / 11:10

2 respostas

2

Com seu comando mv *.o *.hi $srcpath $objpath você está movendo cada arquivo com * .o ou * .hi, mais a pasta src da pasta $(pwd) atual para Obj

Se você quiser mover todos os arquivos * .o e * .hi localizados na pasta src , você pode usar isto:

#!/bin/bash
srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"

mv $srcpath/*.o $srcpath/*.hi  $objpath

Verifique se o seu script bash está sendo executado na pasta correta, portanto, o comando $(pwd) funciona corretamente.

Editar:

Se você quiser mover uma coleção de arquivos ou arquivos com uma determinada extensão, pode alterar o script para ficar assim (graças a link :

#!/bin/bash

srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"

##declare an array variable
declare -a arr=("*.o" "*.hi")

##loop trough the array to move
for i in "${arr[@]}"
do
    mv $srcpath/$i $objpath
done
    
por 12.07.2018 / 11:42
2

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" {} +
    
por 12.07.2018 / 12:03