将带扩展名的文件从源移动到目标

将带扩展名的文件从源移动到目标

您好,我正在尝试将所有带有扩展名的文件从目标文件夹移动.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

答案1

使用你的命令,mv *.o *.hi $srcpath $objpath你将把每个带有 *.o 或 *.hi 的文件以及文件夹 src 从当前$(pwd)文件夹移动到 Obj

如果您想要移动文件夹中的每个 *.o 和 *.hi src,那么您可以使用以下命令:

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

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

确保您的 bash 脚本在正确的文件夹中运行,以便$(pwd)命令正常运行。

编辑:

如果你想移动一组文件或具有特定扩展名的文件,你可以将脚本更改为如下所示(感谢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

答案2

您似乎将*.o*.hi视为某种过滤器mv。但事实并非如此。该工具需要路径。您的 shell 可以将*.o和扩展*.hi到当前目录中所有合适的本地路径;如果它有效,mv将看到路径,而不是模式。显然您没有匹配的文件,因此这些模式不会扩展并按mv原样到达,因此

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

ETC。

这些语法可能有效:

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"不会被这里的 shell 扩展;而是按find字面意思获取它们并使用其固有的模式匹配过程。

该解决方案将为每个文件运行一个单独的解决方案。我们可以通过语法mv传递许多参数,但由于语法要求这些参数位于最后,因此我们需要支持(POSIX 不要求这样做,因此您可能会或可能不会支持它):mvfind … -exec … {} +mv-tmv

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

相关内容