ソースから宛先への拡張子を持つファイルの移動


0

こんにちは、すべてのファイル.hi.o拡張子を持つファイルをターゲットフォルダー/srcから別のフォルダーに移動しようとしています/Obj

これまでのところ、私は試しました:

    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? 

コマンドはどのようにすべきですmv extensions source dest ?か:またはmv source dest extensions

私が試してみました:

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

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

mv *.o *.hi  $srcpath  $objpath

そして、私は次のエラーを受け取ります:

    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

回答:


2

コマンドmv *.o *.hi $srcpath $objpathを使用すると、*。oまたは* .hiを含むすべてのファイルに加えて、現在の$(pwd)フォルダーからObjにフォルダーsrcを移動します。

フォルダsrcにあるすべての* .oと* .hiを移動する場合は、これを使用できます。

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

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

$(pwd)コマンドが正しく機能するように、bashスクリプトが正しいフォルダーで実行されていることを確認してください。

編集:

ファイルのコレクションまたは特定の拡張子を持つファイルを移動する場合は、スクリプトを次のように変更できます(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

だから、特定のソースフォルダの拡張機能のコレクションを発行する方法はありませんか?それらを手動で追加する必要がありますか?extension0 $srcpath.....extensionN $srcpathする方法はありません[extension0...extensionN] $srcpath
Bercovici Adrian

1
回答を編集したので、ファイル名のコレクションを移動できます
-chloesoe

どうもありがとうございましたが、1。@インデックスの略です。2.あなたが書いたとき$srcpath/$ii1 、たとえば、それが持つすべてのファイルを選択し、*.hi拡張子?
Bercoviciエイドリアン

1.はい、@はインデックスです。2.はい、テストして実行するようにスクリプトを変更するmv $srcpath/${arr[1]} $objpathと、*。hiファイルのみが移動します
chloesoe

2

あなたは、治療するように見える*.o*.hiで使用されるフィルタのいくつかの種類としてmv。これは仕組みではありません。ツールにはパスが必要です。拡張することができますあなたのシェル*.o*.hi、現在のディレクトリからすべての適切なローカルパスへ。うまくいけばmv、パターンではなくパスが表示されます。どうやら一致するファイルがないため、これらのパターンは展開されずmv、そのままになります。したがって、

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

次の構文が機能する場合があります。

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

それでも、に一致するファイルがない場合は(ある程度)失敗します./src。あなたがしたように変数を導入することができますが、

  • おそらく必要ありませんが$(pwd)srcpath="./src"十分なはずです。
  • 一般に、変数を引用する必要があります(パターンは引用しないでください)。例:

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

ファイルが多すぎる場合、ヒットしargument list too longます。


を使用findするこの代替ソリューションは、多数のファイルで動作するか、まったくファイルが動作しないはずです。

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

man 1 find仕組みをご覧ください-exec。また、引用符のおかげで、このような文字列"*.o"はシェルによって展開されないことに注意してください。findそれらを文字通り取得し、その固有のパターンマッチング手順を使用します。

ソリューションは、mvファイルごとに個別に実行されます。構文のmvおかげで多くの引数を渡すことができfind … -exec … {} +ますが、構文ではこれらの引数が最後にある必要があるmvため、サポートする必要があります-t(POSIXでは必要ないため、mvサポートする場合としない場合があります)。

find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv -t "$objpath" {} +
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.