猛砸想請你報你的變量。
#!/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
目錄消失,您將得到一個錯誤,而不是默默地將第一個$文件夾重命名爲Finished,然後將所有其他匹配移至第一個匹配。
請注意,我爲某些調試輸出使用了printf
,以防您的$folder
之一以連字符開頭。
UPDATE#1:您現在已通過-v
選項控制調試。
UPDATE#2:我剛剛意識到您正在檢查*.info
字面上的存在。注:
[email protected] ~$ mkdir foo
[email protected] ~$ touch foo/\*.info
[email protected] ~$ 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 ..
[email protected] ~$ [[ -e "foo/*.info" ]] && echo yes
yes
[email protected] ~$ mv foo/\*.info foo/bar.info
[email protected] ~$ [[ -e "foo/*.info" ]] && echo yes
[email protected] ~$
如果你真的想找到什麼是「在結尾的.info的任何文件」,然後[[ -e
是不是要走的路。在我更多地瞭解這個答案之前,請確認。 :)
更新#3:
下面是找到移動你的文件夾,如果該文件夾conains任何.info文件版本。請注意,這是而不是 grep ls
的輸出。
[[email protected] ~/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
[[email protected] ~/tmp1]$ find . -print
.
./doit
./baz
./foo
./foo/bar.info
./Finished
[[email protected] ~/tmp1]$ ./doit -v
Finished ... skipped
baz ... skipped
doit ... skipped
foo -> ./Finished/foo
[[email protected] ~/tmp1]$
認沽'$ folder'引號。即'mv「$文件夾」./ Finished /'。見下文。 – ghoti 2012-08-08 11:22:54
在'mv'中引用你'$ folder'。該命令將是'mv「$文件夾」/完成「 – nshy 2012-08-08 11:23:28