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

时间:2010-09-20 17:37:21

标签: file shell unix

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

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

所以我读了这个文件,并在不同的变量中存储了路径。我有多个源路径,所以我将它存储在一个充当数组的变量中。如下::

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天的文件,我想在移动后从源路径中删除这些文件。请帮忙

还有一个问题!!如果我想存储名称中包含时间戳的zip文件,那么在目标路径上不会出现文件名重复。

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

嗨大家好,我又回来了一个问题。在下面的脚本中我可以使用下面的代码按照上面给出的路径创建zip的文件名作为基本路径名..egxyz.zip和abc.zip ::

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

但是现在我想创建这个文件名(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

表示我想使用最后三个目录名来创建新的zip文件名。它提供了文本文件中的源路径内容超过三个目录名。

所以有人可以帮助我。 事先提醒!!!

2 个答案:

答案 0 :(得分:2)

要创建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文件)


要将文件从源移动到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 -@
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

答案 1 :(得分: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可能不包含空格或制表符,也不会递归搜索日志文件。