Dateien mit der Erweiterung von der Quelle zum Ziel verschieben

595
Bercovici Adrian

Hallo, ich versuche, alle Dateien mit .hiund der .oErweiterung von einem Zielordner /srcin einen anderen Ordner zu verschieben/Obj

Bisher habe ich versucht:

 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?  

Wie soll der Befehl sein: mv extensions source dest ?odermv source dest extensions

Ich habe versucht:

srcpath=$(pwd)"/src" objpath=$(pwd)"/Obj"  ghc src/Company.hs > Logs/output.txt 2> Logs/Err.txt  mv *.o *.hi $srcpath $objpath 

Und ich erhalte folgende Fehlermeldung:

 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 
0

2 Antworten auf die Frage

2
chloesoe

Mit Ihrem Befehl verschieben mv *.o *.hi $srcpath $objpathSie jede Datei mit * .o oder * .hi sowie den Ordner src aus dem aktuellen $(pwd)Ordner nach Obj

Wenn Sie alle * .o und * .hi verschieben möchten, die sich im Ordner befinden src, können Sie Folgendes verwenden:

#!/bin/bash srcpath=$(pwd)"/src" objpath=$(pwd)"/Obj"  mv $srcpath/*.o $srcpath/*.hi $objpath 

Stellen Sie sicher, dass Ihr Bash-Skript im richtigen Ordner ausgeführt wird, damit der $(pwd)Befehl ordnungsgemäß funktioniert.

Bearbeiten:

Wenn Sie eine Sammlung von Dateien oder Dateien mit einer bestimmten Erweiterung verschieben möchten, können Sie das Skript folgendermaßen ändern (dank 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 "$" do mv $srcpath/$i $objpath done 
Es gibt also keine Möglichkeit, eine Sammlung von Erweiterungen für einen bestimmten Quellordner auszustellen. Sie müssen sie manuell hinzufügen. `extension0 $ srcpath ..... extensionN $ srcpath` Gibt es keine Möglichkeit,` [extension0 ... extensionN] $ srcpath `auszuführen? Bercovici Adrian vor 6 Jahren 0
Ich habe meine Antwort bearbeitet, damit Sie eine Sammlung von Dateinamen verschieben können chloesoe vor 6 Jahren 1
Vielen Dank, aber könnten Sie bitte ** 1 erklären. ** Das "@" steht für den Index? ** 2. ** Wenn Sie "$ srcpath / $ i" schreiben und "i" beispielsweise "1" ist, werden alle Dateien mit der Erweiterung "* .hi" ausgewählt. Bercovici Adrian vor 6 Jahren 0
** 1. ** Ja, @ ist der Index. ** 2. ** Ja, Sie können das Skript ändern, um `mv $ srcpath / $ $ objpath` zu testen und auszuführen. Dann werden nur die * .hi-Dateien verschoben chloesoe vor 6 Jahren 0
2
Kamil Maciorowski

Sie scheinen zu behandeln *.ound *.hials eine Art Filter, der von verwendet wird mv. So funktioniert es nicht. Das Tool erwartet Pfade. Ihre Schale kann erweitern *.ound *.hiauf alle geeigneten lokalen Pfaden aus dem aktuellen Verzeichnis; Wenn es funktionierte, mvwürde man Pfade sehen, keine Muster. Anscheinend haben Sie keine übereinstimmenden Dateien, so dass diese Muster nicht erweitert werden und sich so verhalten, mvwie sie sind

mv: cannot stat '*.o': No such file or directory 

usw.

Diese Syntax kann funktionieren:

mv ./src/*.o ./src/*.hi ./obj/ 

Trotzdem wird es (etwas) fehlschlagen, wenn keine passenden Dateien vorhanden sind ./src. Sie können Variablen wie Sie einfügen, aber

  • Sie brauchen wahrscheinlich nicht $(pwd), srcpath="./src"sollte genug sein;
  • Im Allgemeinen sollten Sie Ihre Variablen (aber keine Muster) zitieren, z.

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

Wenn es zu viele Dateien gibt, werden Sie treffen argument list too long.


Diese alternative Lösung findsollte mit einer hohen Anzahl von Dateien oder ohne Dateien funktionieren:

find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv {} "$objpath" \; 

Erfahren Sie man 1 find, wie es -execfunktioniert. Beachten Sie auch, dass dank der Anführungszeichen Strings wie "*.o"von der Shell hier nicht erweitert werden. findholt sie wörtlich und verwendet ihr intrinsisches Pattern-Matching-Verfahren.

Die Lösung führt mvfür jede Datei eine separate Datei aus. Wir können mvdank find … -exec … {} +Syntax viele Argumente übergeben, aber da die Syntax erfordert, dass diese Argumente ganz am Ende sind, müssen wir dies mvunterstützen -t(dies ist für POSIX nicht erforderlich, daher mvkann es sein, dass Sie es unterstützen):

find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv -t "$objpath" {} +