2010-09-20 138 views
0

我想将日志文件从一个路径(源路径)移动到另一个路径(目标路径)。此源路径和目标路径存在于一个文本文件中。为::如何使用shell脚本将文件从一个路径移动到unix中的另一个路径

source_path=abc/xyz 
    source_path=pqr/abc 
    desination_path=abcd/mlk 

所以我读取此文件并存储在路径不同variables.i有多个源极路径,所以我其存储在充当阵列的varible。如下所示::

sourcePaths=`grep source_path myfile |cut -d= -f2` 
destPath=`grep destination_path myfile |cut -d= -f2` 

和我只有一个目标路径,我想要移动所有这些文件。 现在我想遍历所有这些源路径,找到具有特定扩展名的日志文件,将这些所有文件压缩并移至目标路径。 我使用循环从sourcePaths变量中检索数据(这只是试用版)。如:;

for i in $sourcePaths 
do 
    echo $i 
done 

任何人都可以帮助我。

非常感谢您的回复Guys.Now我想在此添加一些过滤器。我想从源路径中移动10天的文件,并且我想在移动后从源路径中删除这些文件。请帮忙

只有一个问题!如果我想存储包含时间戳的名称的压缩文件,以便在目标路径上不会有重复的文件名。

大家好,还有一个问题。当我用上面的选项压缩文件时,它会根据它的path.ie创建zip文件中的子文件夹。如果我从src/int/xlog/abc中压缩日志文件,并且当我解压zip文件时,这些新创建的zip文件内容将日志文件记录在src/int/xlog/abc/abc.zip中。我不想要这个。我想要的是这个zip文件直接内容abc.zip。不在子文件夹中。

嗨,大家好,我回来了,使用下面的脚本,我能够创建zip为基础pathname.egxyz.zip和abc.zip按使用下面的代码我上面给出的路径的文件名多了一个question.Here: :

timestamp=`date +%Y%m%d_%H%M%S` 
zipFile=$destPath/$(basename $sourcePath).$timestamp.zip 

但现在我想创建,如果更具体取决于其源path.Like这个文件名(ieZip文件名)我的文本文件内容

source_path=obj/imp/backup/logs/db1 
source_path=obj/res/input/int/db2 
desination_path=abcd/mlk 

现在我想创建一个zip文件名称。

backup_logs_db1.zip 
input_int_db2.zip 

意味着我想用最后三个目录名来创建新的压缩文件名。它提供的文本文件中的源路径内容超过三个目录名称。

所以任何人都可以帮助我。 提前Thnaks!

回答

2

要创建ZIP压缩文件,你可以这样做:

for sourcePath in $sourcePaths 
do 
    zipFile=$destPath/$(basename $sourcePath).zip 
    find $sourcePath -type f -name "*.log" | xargs zip $zipFile [email protected] 
done 

,这将创造

abcd/mlk/xyz.zip(含在ABC/XYZ的所有* .log文件)和
abcd/mlk/abc.zip(含所有的* .LOG下PQR文件/ ABC)

要创建gzip压缩的档案,您可以:

for sourcePath in $sourcePaths 
do 
    tarFile=$destPath/$(basename $sourcePath).tar 
    find $sourcePath -type f -name "*.log" -exec tar -uvf $tarFile {} \; 
    gzip $tarFile 
done 

这将创造:

abcd/mlk/xyz.tar.gz(含有下ABC/XYZ所有* .log文件)
abcd/mlk/abc.tar.gz(包含所有* .log文件下PQR/ABC)


移动文件从源头到dest中,还没有过去10天内修改,您可以使用此:

for sourcePath in $sourcePaths 
do 
    find $sourcePath -type f -mtime +10 -name "*.log" -exec mv {} $destPath \; 
done 

如果你想使用压缩和解后删除输入文件如下:

for sourcePath in $sourcePaths 
do 
    zipFile=$destPath/$(basename $sourcePath).zip 
    find $sourcePath -type f -mtime +10 -name "*.log" | xargs zip -mT $zipFile [email protected] 
done 

使用date命令生成一个时间戳。该标志是:

%Y is the year 
%m is the month 
%d is the day 
%H is the hour 
%M are the minutes 
%S are the seconds 

时间戳添加到压缩文件的名字,所以就变成:

for sourcePath in $sourcePaths 
do 
    timestamp=`date +%Y%m%d_%H%M%S` 
    zipFile=$destPath/$(basename $sourcePath).$timestamp.zip 
    find $sourcePath -type f -mtime +10 -name "*.log" | xargs zip -mT $zipFile [email protected] 
done 

使用-j拉链标志只存储文件名不目录名。新的命令将是:

for sourcePath in $sourcePaths 
do 
    timestamp=`date +%Y%m%d_%H%M%S` 
    zipFile=$destPath/$(basename $sourcePath).$timestamp.zip 
    find $sourcePath -type f -mtime +10 -name "*.log" | xargs zip -jmT $zipFile [email protected] 
done 
+0

@fahd ::非常感谢你的答复。现在我想在此添加一些过滤器。我想从源路径中移动10天的文件,并且我想在移动后从源路径中删除这些文件。请帮助 – MAS1 2010-09-22 09:45:02

+0

@fahd ::感谢您的即时答复。只有一个问题,我以前的条件是否也适用于此。我的意思是压缩文件。我想只添加这两个过滤器,保持以前的状态,因为它是。您的以前的答案satiesfies我以前的所有条件,想知道这个新post.And我想从源路径移动后删除移动的文件。 – MAS1 2010-09-22 10:11:18

+0

是的,以前的条件会继续工作。 'mv'命令移动文件,所以是的,它们将不再处于源路径中。 – dogbane 2010-09-22 10:26:07

1

以下将遍历所有源路径,在$ destPath中创建一个tar.gz文件。该.tar.gz包含一个名为$sourcePath的文件夹,其中包含日志文件(扩展名为.log的文件)。
.tar.gz文件的名称将基于$ sourcePath的基本名称,abc/xyz将导致要创建的文件xyz.tar.gz

for sourcePath in $sourcePaths;do 
    name=`basename $sourcePath` 
    tar czf "$destPath/$name.tar.gz" $sourcePath/*.log 
done 

注意:您source_path S可不能包含空格或制表符,日志文件没有递归搜索。

相关问题