bash以交互方式识别mv命令,但脚本中的命令出错

时间:2011-12-21 18:33:18

标签: bash

我用以下代码编写了一个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权限。文件本身由不同的用户拥有,但这不应该证明对目录具有写权限的问题。任何想法都会受到高度赞赏吗?

4 个答案:

答案 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实用程序,我会使用它来代替whilefor循环:

grep -lZ 'string' /home/test/dirpath/* | xargs -0 mv -ft "$sc_dir"