2011-12-21 4 views
1

スクリプト内のコマンドでエラー:bashが対話的にmvコマンドを認識しますが、私は次のコードで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:ライン6 :mv -f /home/test/dirpath/test.txt/home/test/mvdir:そのようなファイルやディレクトリはありません

しかし、この正確なmvコマンドを同じユーザのシェルにコピーすると、ファイルを移動します。ディレクトリには名前が付けられ、スクリプト内のパスがあります(前述のように、コマンドは対話シェルに直接コピーされたときに動作します)。ユーザーはソースディレクトリと宛先ディレクトリの両方に対してrwx権限を持っています。ファイル自体は別のユーザーによって所有されていますが、ディレクトリへの書き込み権限に問題はないはずです。どんなアイデアも高く評価されますか?

答えて

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/*) 
+0

良いのですが、たぶん、 'grepの:-)何人かの人々のために' < 'あまりにも多くがあるかもしれません-l 'string'/home/test/dirpath/* | read -r 'は読みやすくなります。 –

+0

ここで最高のものを選ぶのは難しいです。あなたのものは最も細部を持っています(そして、私の記憶をbashでリフレッシュします、それはしばらくありました)。 –

+0

@AaronMcDaid - これは読みやすいかもしれませんが、パイプラインはサブシェルを生成しますが、コマンド置換は発生しません。 – jordanm

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

を試してみてください。あなたがエラーを参照してください理由は次のとおりです。

./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" 
1

GNUユーティリティを仮定すると、私が代わりにwhileforループのにこれを使用します。

grep -lZ 'string' /home/test/dirpath/* | xargs -0 mv -ft "$sc_dir" 
関連する問題