Déplacement de fichiers avec extension de la source à la destination

0

Bonjour , Je suis en train de déplacer tous les fichiers avec .hiet l' .oextension d'un dossier cible /srcdans un autre dossier/Obj

Jusqu'ici j'ai essayé:

    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? 

Comment la commande devrait-elle être: mv extensions source dest ?oumv source dest extensions

J'ai essayé:

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

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

mv *.o *.hi  $srcpath  $objpath

Et j'obtiens l'erreur suivante:

    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
Bercovici Adrian
la source

Réponses:

2

Avec votre commande, mv *.o *.hi $srcpath $objpathvous déplacez chaque fichier avec * .o ou * .hi plus le dossier src du $(pwd)dossier actuel vers Obj

Si vous voulez déplacer tous les * .o et * .hi qui se trouvent dans le dossier src, vous pouvez utiliser ceci:

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

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

Assurez-vous que votre script bash s'exécute dans le bon dossier pour que la $(pwd)commande fonctionne correctement.

Modifier:

Si vous souhaitez déplacer une collection de fichiers ou des fichiers avec une certaine extension, vous pouvez modifier le script pour qu’il ressemble à cela (grâce à https://stackoverflow.com/a/8880633/7311363 ):

#!/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
chloe
la source
Il n’existe donc aucun moyen de créer une collection d’extensions pour un dossier source donné, vous devez les ajouter manuellement. extension0 $srcpath.....extensionN $srcpathN'y a-t-il aucun moyen de le faire[extension0...extensionN] $srcpath
Bercovici Adrian
1
J'ai modifié ma réponse afin que vous puissiez déplacer une collection de noms de fichiers
chloesoe
Merci beaucoup, mais pourriez-vous s'il vous plaît expliquer 1. les @supports de l'indice? 2. Lorsque vous écrivez $srcpath/$iet iest 1 par exemple, il sélectionne tous les fichiers avec l' *.hiextension?
Bercovici Adrian
1. oui, @ est l'index. 2. oui, vous pouvez changer le script pour tester et exécuter mv $srcpath/${arr[1]} $objpath, puis seuls les fichiers * .hi seront déplacés
chloesoe
2

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" {} +
Kamil Maciorowski
la source