如何使用shell脚本将文件从一个path移动到unix中的另一个path

我想将日志文件从一个path(源path)移动到另一个path(目标path)。 此源path和目标path存在于一个文本文件中。 如::

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

所以我读这个文件和存储path在不同的variables。我有多个源path,所以我把它存储在一个variables作为数组。 如下::

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

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

 for i in $sourcePaths do echo $i done 

任何人都可以帮助我

非常感谢您的答复伙计们。现在我想添加一些filter在这个。 我想从源path移动10天的文件,我想移动后从源path删除这些文件。 请帮忙

还有一个问题! 如果我想存储这个带有时间戳名称的zip文件,那么在目标path上将不会有重复的文件名。

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

嗨,大家好,我回来了一个更多的问题。这里使用下面的脚本,我可以创buildzip文件的文件名为基本pathname.egxyz.zip和abc.zip按照我上面给出的path使用下面的代码::

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

但是现在我想创build这个文件名(ieZip文件名)更具体取决于它的源path。就像我的文本文件内容

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

现在我想创build一个像这样的zip文件名。

 backup_logs_db1.zip input_int_db2.zip 

意味着我想使用最后三个目录名称来创build新的zip文件名称。 在文本文件中提供的源path多于三个目录名称。

那么有人能帮助我吗? Thnaks提前!

要创建ZIP档案,你可以这样做:

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

这将创建

abcd/mlk/xyz.zip (包含abc / xyz下的所有* .log文件)和
abcd/mlk/abc.zip (包含pqr / abc下的所有* .log文件)

要创建GZIPped档案,您可以:

 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 (包含pqr / abc下的所有* .log文件)


要将文件从源文件移动到目标文件,在过去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 -@ 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 

将时间戳添加到zipFile的名称,因此它变成:

 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 -@ done 

使用-j zip标志只存储没有目录名的文件名。 新的命令将是:

 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 -@ done 

以下将遍历所有源路径,在$ destPath中创建一个tar.gz文件。 这个.tar.gz包含一个名为$sourcePath的文件夹,其中包含logfiles文件(扩展名为.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可能不包含空格或制表符,日志文件不会被递归搜索。