我用以下代码编写了一个bash脚本:
#! /bin/bash
sc_files=`grep -l 'string' /home/test/dirpath/*`
sc_dir='/home/test/mvdir'
for i in $sc_files
do
"mv -f $i $sc_dir";
done
脚本的输出产生: ./test.sh:line 6:mv -f /home/test/dirpath/test.txt / home / test / mvdir:没有这样的文件或目录
但是,当这个确切的mv命令被复制到同一用户下的shell中时,它会工作并移动文件。这些目录已命名并具有脚本中的路径(如上所述,当命令直接复制到交互式shell时,移动有效),并且我的用户对源目录和目标目录都具有rwx权限。文件本身由不同的用户拥有,但这不应该证明对目录具有写权限的问题。任何想法都会受到高度赞赏吗?
答案 0 :(得分:3)
正如第一个答案所指出的那样,你的移动命令上的引用是不正确的。当你引用整个命令及其参数时,bash会看到包含空格的整个字符串作为命令。
您提供的代码段还有另一个问题。如果任何文件名称中包含空格,则for循环将无法正常工作。即使您知道没有文件包含空格,最好使用while循环。
sc_dir=/home/test/mvdir
while read -r file
do
mv -f "$file" "$sc_dir"
done < <(grep -l 'string' /home/test/dirpath/*)
答案 1 :(得分:2)
错误的引号,请尝试
#! /bin/bash
sc_files=`grep -l 'string' /home/test/dirpath/*`
sc_dir='/home/test/mvdir'
for i in $sc_files
do
mv -f "$i" "$sc_dir";
done
答案 2 :(得分:2)
它被视为一个字符串,并试图查看整行是文件还是目录。这就是你看到错误的原因:
./test.sh: line 6: mv -f /home/test/dirpath/test.txt /home/test/mvdir: No such file or directory
在删除mv命令周围的双引号后尝试:
mv -f $i $sc_dir;
甚至更好:
mv -f "$i" "$sc_dir"
答案 3 :(得分:1)
假设使用GNU实用程序,我会使用它来代替while
或for
循环:
grep -lZ 'string' /home/test/dirpath/* | xargs -0 mv -ft "$sc_dir"