Bashは、変数を引用するように求めています。
#!/bin/bash
if [[ "$1" = "-v" ]]; then
Verbose=true
vopt="-v"
shift
else
Verbose=false
vopt=""
fi
for folder in *; do
$Verbose && printf "%s" "$folder"
if [[ -e "$folder/*.info" ]]; then
if mv "$vopt" "$folder" ./Finished/; then
$Verbose && echo -n " ... done"
fi
fi
$Verbose && echo ""
done
ターゲットディレクトリをスラッシュで終了することをお勧めします。そうすれば、何らかの理由でFinished
ディレクトリが消えた場合、最初の$ folderの名前を黙ってFinishedに変更してから、他のすべての一致を最初の一致に移動するのではなく、エラーが発生します。
また、いずれかのがハイフンで始まるprintf
場合に備えて、デバッグ出力の一部に使用していることにも注意してください。$folder
更新#1:オプションでデバッグを制御できるようになり-v
ました。
更新#2*.info
:文字通りの存在をチェックしていることに気づきました。ノート:
ghoti@pc ~$ mkdir foo
ghoti@pc ~$ touch foo/\*.info
ghoti@pc ~$ ls -la foo
total 0
-rw-r--r-- 1 ghoti ghoti 0 8 Aug 07:45 *.info
drwxr-xr-x 3 ghoti ghoti 102 8 Aug 07:45 .
drwx------+ 10 ghoti ghoti 340 8 Aug 07:44 ..
ghoti@pc ~$ [[ -e "foo/*.info" ]] && echo yes
yes
ghoti@pc ~$ mv foo/\*.info foo/bar.info
ghoti@pc ~$ [[ -e "foo/*.info" ]] && echo yes
ghoti@pc ~$
あなたが本当に見つけたいのが「.infoで終わるファイル」であるなら、それ[[ -e
は行く方法ではありません。私がこの答えにさらに取り組む前に、plsは確認します。:)
更新#3:
これは、フォルダに.infoファイルが含まれている場合にフォルダを移動することを検出するバージョンです。これはの出力をgrepしないことに注意してくださいls
。
[ghoti@pc ~/tmp1]$ cat doit
#!/bin/bash
if [[ "$1" = "-v" ]]; then
Verbose=true
vopt="-v"
shift
else
Verbose=false
vopt=""
fi
for folder in *; do
infofile="$(
if [[ -d "$folder" ]]; then
cd "$folder"
for file in *.info; do
if [[ -f "$file" ]]; then
echo "$file"
break
fi
done
fi
)"
if [[ -f "$folder/$infofile" ]]; then
mv "$vopt" "$folder" ./Finished/
elif $Verbose; then
printf "%s ... skipped\n" "$folder"
fi
done
[ghoti@pc ~/tmp1]$ find . -print
.
./doit
./baz
./foo
./foo/bar.info
./Finished
[ghoti@pc ~/tmp1]$ ./doit -v
Finished ... skipped
baz ... skipped
doit ... skipped
foo -> ./Finished/foo
[ghoti@pc ~/tmp1]$