您好,我正在尝试将所有带有扩展名的文件从目标文件夹移动.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 不要求这样做,因此您可能会或可能不会支持它):mv
find … -exec … {} +
mv
-t
mv
find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv -t "$objpath" {} +