帮助shell脚本根据条件查找和移动文件
寻找一些帮助我的bash脚本。我试图写这个shell脚本执行以下操作:帮助shell脚本根据条件查找和移动文件
找到一个名为DIR文件:
server1-date.done
server2-date.done
server3-date.done
...
server10-date.done
打印到
listA
- 在dir(* .gz)中查找文件并打印到
listB
- 如果
listA
有10
计数(发现基本上10个.done
文件),然后 入手移动从listB
文件后,在listB
将文件移动到新目录 - ,然后删除旧的目录,其名称类似(
server1-date
,server2-date
,...)和.done文件。
到目前为止,我已经在作品中了。我无法获得if
部分工作的条件。我认为我没有正确编码。任何代码建议,改进等,将不胜感激。谢谢。
#Directories
GZDIR=/mydumps/mytest
FINALDIR=/mydumps/mytest/final
FLGDIR=/backup/mytest/flags
export GZDIR FINALDIR FLGDIR
#lists
FLGLIST="/mydumps/mytest/lists/userflgs.lst"
GZLIST="/mydumps/mytest/lists/gzfiles.lst"
export FLGLIST GZLIST
#Find files
find $FLGDIR -name \*.done -print > $FLGLIST
find $GZDIR -name \*.gz -print > $GZLIST
#Get need all (10) flags found before we do the move
FLG_VAL =`cat $FLGLIST | wc -l`
export $FLG_VAL
if [ "$FLG_VAL" = "10" ]; then
for FILE in $GZLIST
do
echo "mv $GZLIST $FINALDIR" 2>&1
for FLAG in $FLGLIST
do
echo "rmdir -f $FLAG" 2>&1
done
done
else
echo "Cannot move file" 2>&1
exit 0
fi
我不知道这是否会工作,但它会解决所有明显的问题:
#!/bin/sh
#Directories
GZDIR=/mydumps/mytest
FINALDIR=/mydumps/mytest/final
FLGDIR=/backup/mytest/flags
export GZDIR FINALDIR FLGDIR
#lists
FLGLIST="/mydumps/mytest/lists/userflgs.lst"
GZLIST="/mydumps/mytest/lists/gzfiles.lst"
#Find files
find "$FLGDIR" -name '*.done' -print > "$FLGLIST"
find "$GZDIR" -name '*.gz' -print > "$GZLIST"
#Get need all (10) flags found before we do the move
FLG_VAL=$(wc -l <"$FLGLIST") # Always prefer $(...) to backticks.
if [ "$FLG_VAL" -ge 10 ]; then
for FILE in $(cat "$GZLIST")
do
echo "mv $FILE $FINALDIR" 2>&1
done
for FLAG in $(cat "$FLGLIST")
do
echo "rmdir -f $FLAG" 2>&1
done
else
echo "Cannot move file" 2>&1
exit 0
fi
感谢您的清理。我得到它没有错误的工作。 – jdamae 2011-03-12 00:04:24
我必须删除'.done'标志和目录:'rm -f/mydumps/mytest/flags/server1-20110311.done'和'rmdir -f/mydumps/mytest/flags/server1-20110311'。我可以在相同的循环中执行此操作吗? – jdamae 2011-03-12 00:11:55
@jdamae - 是的,你可以。 :-)这不是很难,我会准确地留下如何去做,让你迷惑一段时间。 – Omnifarious 2011-03-12 00:35:44
FLG_VAL =`cat $FLGLIST | wc -l`
应该是:
FLG_VAL=`cat $FLGLIST | wc -l`
更好:'FLG_VAL = $(wc -l 2011-03-12 04:36:45
首先,我真的建议你作为默认的态度总是test for exceptions,并且不包括测试,除非这里面的“正常”的情况下,是必要的。
...
FLG_VAL=`wc -l < $FLGLIST` # no need for cat, and no space before '='
export $FLG_VAL
if [ "$FLG_VAL" != "10" ]; then
echo "Cannot move file" 2>&1
exit 0
fi
for FILE in $GZLIST
do
echo "mv $GZLIST $FINALDIR" 2>&1
for FLAG in $FLGLIST
do
echo "rmdir -f $FLAG" 2>&1
done
done
查看代码现在读取多少容易,错误检查被提取并自行维护?
是的,谢谢你的建议。一直在寻找最佳实践。 – jdamae 2011-03-12 00:03:39
'$出口是FLG_VAL'都完全没有必要的,而且也很可能没有做任何事情,甚至接近到什么你认为它在做。 – Omnifarious 2011-03-11 23:47:43
不需要导出任何这些变量(或间接地,它们的内容)。 – 2011-03-12 04:38:40
有没有办法在执行之前检查所有语法? – jdamae 2011-03-12 22:59:16