我们将1992年至2015年的大量文件转储到一个巨大的文件夹中,我们需要压缩并删除原始文件。
文件的名称中有yyyymm。
这是我写的脚本
#!/usr/bin/ksh
MYHOME=/home/myhome
MYARCHIVE=$MYHOME/data/ARCHIVE
MOVED=$MYARCHIVE/MONTHLY_MOVED
TEMPFOLDER=$MYARCHIVE/TempFolder
. $MYHOME/bin/FILEWATCHERS/Profile.ksh
mkdir -p $MOVED
for y in 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
do
for m in 01 02 03 04 05 06 07 08 09 10 11 12
do
echo "Year $y month $m"
mkdir -p $TEMPFOLDER
find $MYARCHIVE/. -name . -o -type d -prune -o -name '*$y$m*' -print | xargs -i mv {} $TEMPFOLDER/.
cd $TEMPFOLDER
count=`ls -1 | wc -l`
echo "Count is $count"
if [ "$count" -ne 0 ]
then
tar cvf $MOVED/Monthly_Files_$y$m.tar .
fi
cd ..
rm -rf $TEMPFOLDER
done
done
脚本无效,即使有20000个文件格式为 201512 的文件。
单独在shell(ksh和csh)上,此命令可以正常工作
find /home/myhome/data/ARCHIVE/. -name . -o -type d -prune -o -name '*201512*' -print | xargs -i mv {} /home/myhome/ARCHIVE/TempFolder/.
脚本中缺少什么?
答案 0 :(得分:4)
我认为问题出在这一行
find $MYARCHIVE/. -name . -o -type d -prune -o -name '*$y$m*' -print | xargs -i mv {} $TEMPFOLDER/.
shell变量没有被值'*$y$m*'
替代而不是单引号使用双引号"*$y$m*"
然后它应该有用。
单引号 - 用单引号(''')括起字符可保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。
双引号 - 用双引号括起来的字符('“')保留引号内所有字符的字面值,除了'$','
’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘
'在双引号中保留其特殊含义。反斜杠只有在跟随以下字符之一时才会保留其特殊含义:'$','`',''','\'或换行符。在双引号内,将删除后跟其中一个字符的反斜杠。没有特殊含义的字符前面的反斜杠不做修改。双引号可以在双引号内引用,前面加一个反斜杠。如果启用,将执行历史记录扩展,除非使用反斜杠转义出现在双引号中的“!”。 '!'前面的反斜杠不会被删除。 在双引号中,特殊参数'*'和'@'具有特殊含义。
声明应如下
find $MYARCHIVE/. -name . -o -type d -prune -o -name "*$y$m*" -print | xargs -i mv {} $TEMPFOLDER/.