【问题标题】:how to move files from one path to another path in unix using shell-script如何使用shell脚本将文件从一个路径移动到Unix中的另一个路径
【发布时间】:2010-09-20 17:37:21
【问题描述】:

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

  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

谁能帮帮我。

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

再问一个问题!!如果我想用包含时间戳的名称存储这个 zip 文件,这样在目标路径中不会有重复的文件名。

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

嗨,伙计们,我又回来了一个问题。在这里,我可以使用下面的脚本创建 zip 的文件名作为基本路径名。例如,xyz.zip 和 abc.zip 按照我上面给定的路径使用下面的代码::

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

但现在我想创建这个文件名(即 Zip 文件名)更具体取决于它的源路径。就像我的文本文件内容一样

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 文件名。提供文本文件内容中的源路径多于三个目录名。

那么任何人都可以在这方面帮助我。 提前谢谢!!!

【问题讨论】:

    标签: file shell unix


    【解决方案1】:

    要创建 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
    

    【讨论】:

    • @fahd::非常感谢您的回复。现在我想在其中添加一些过滤器。我想从源路径中移动 10 天前的文件,并且我想在移动后从源路径中删除这些文件。请帮忙
    • @fahd::感谢您的即时回复。只是一个问题,我以前的条件是否也适用于此。我的意思是压缩文件。我只想添加这两个过滤器,保持我以前的条件不变。你以前的答案满足我以前的所有条件,想知道这个新帖子。我想在从源路径移动后删除移动的文件。
    • 是的,以前的条件将继续有效。 mv 命令移动文件,所以是的,它们将不再位于源路径中。
    • 在移动之前压缩文件怎么样。我想要这样的序列。使用 .logs 扩展名压缩 10 天前的文件并移动到目标路径。并删除这些移动的文件。
    • 非常感谢您的帮助和即时回复“fahd”。它对我来说很好,我也知道了很多其他的事情。再次感谢。
    【解决方案2】:

    下面会遍历所有源路径,在$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_paths 不能包含空格或制表符,不会递归搜索日志文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-26
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多