4

我有一个包含数千个文件的目录。他们有一个特定的创建日期。现在我想在特定时间将这些文件归档到特定目录。

例子:

创建的文件:

May 15 testmay.txt
Jun 10 testjun.txt
Jul 01 testjul.txt

他们应该进入那些目录

/2013-05/testmay.txt
/2013-06/testjun.txt
/2013-06/testjul.txt

我已经有了这个来将文件从远程服务器同步到临时月份目录。

#!/bin/sh

GAMESERVER=game01
IP=172.1.1.1

JAAR=`date --date='' +%Y`
MAAND=`date --date='' +%m`
DAG=`date --date=''  +%d`
LOGDIR=/opt/archief/$GAMESERVER

if [ ! -e $LOGDIR/$JAAR-$MAAND ]; then
        mkdir $LOGDIR/$JAAR-$MAAND/tmp
        chmod -R 770 $LOGDIR/$JAAR-$MAAND/tmp
fi

rsync -prlt --remove-source-files -e ssh root@$IP:/opt/logs/sessions/ $LOGDIR/$JAAR-$MAAND/tmp

chmod -R 770 $LOGDIR/ -R

我怎样才能完成这个脚本?

4

3 回答 3

5

我只是需要做一些类似的事情,并想出了我认为非常巧妙的方法。我在一个目录中有超过 100 万个文件,我需要根据它们的 mtime 归档这些文件。我用zip在这里存档文件,因为我希望它们被压缩,但也很容易从 Windows 系统访问,但你可以很容易地用简单的mv或任何适合的东西替换它。

SRC="/path/to/src"  # Where the originals are found
DST="/path/to/dst"  # Where to put the .zip file archives

FIND="find $SRC -maxdepth 1 -type f \( -name \*.tmp -o -name \*.log \)" # Base find command

BOUND_LOWER=$( date -d "-3 years" +%s ) # 3 years ago (because we need somewhere to start)
BOUND_UPPER=$( date -d "-1 years" +%s ) # 1 year ago (because we need to keep recent files where they are)

# Round down the BOUND_LOWER to 1st of that month at midnight to get 1st RANGE_START
RANGE_START=$( date -d $( date -d @$BOUND_LOWER +%Y-%m )-01 +%s )

# Loop over each month finding & zipping files until we hit BOUND_UPPER
while [ $RANGE_START -lt $BOUND_UPPER ]; do
    ARCHIVE_NAME=$( date -d @$RANGE_START +%Y-%m )
    echo "Searching for files from $ARCHIVE_NAME"
    RANGE_END=$( date -d "$( date -d @$RANGE_START ) +1 month" +%s )
    eval "$FIND -newermt @$RANGE_START \! -newermt @$RANGE_END -print0" |
        xargs -r0 zip -Tjm $DST/$ARCHIVE_NAME -@
    echo
    RANGE_START=$RANGE_END
done

对于$SRC匹配$FIND条件且在可变时间范围内(到最近的月份)的每个文件,这将根据其 mtime$BOUND_*将其归档到适当的文件。$DST/YYYY-MM.zip

如果您使用的是find4.3.3 之前的版本,请参阅此页面以获取有关如何使用-newer而不是 的示例-newermt,您只需在主循环中执行此操作。

于 2013-10-29T01:42:57.860 回答
1

像这样的东西?

DEBUG=echo
cd ${directory_with_files}
for file in * ; do 
    dest=$(stat -c %y "$file" | head -c 7) 
    mkdir -p $dest
    ${DEBUG} mv -v "$file" $dest/$(echo "$file" | sed -e 's/.* \(.*\)/\1/')
done

免责声明:在您的文件的安全副本中进行测试。我不会对任何数据丢失负责 ;-)

于 2013-07-16T13:30:34.913 回答
1

如果你把

for file
do  dir=/`date +%Y-%m -r$file`
    mkdir -p $dir && mv $file $dir
done

进入一个名为的脚本文件,比如说archive,你可以执行例如

archive *

将所有文件移动到所需的目录。如果这会产生一行太长的错误,请执行

/bin/ls | xargs archive

反而。(如果您想谨慎,可以使用该mv -i选项。)

于 2013-10-17T08:15:26.633 回答