ksh find和xargs mv命令

时间:2015-12-09 22:56:38

标签: find ksh xargs

我们将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/.

脚本中缺少什么?

1 个答案:

答案 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/.