将shell脚本bash到几个目录中的glob文件,添加到存档并删除原始文件

时间:2011-03-24 10:15:12

标签: bash

我正在尝试编写一个执行以下操作的bash脚本:

  1. 枚举目录中与指定模式匹配的文件列表
  2. 创建包含匹配文件的tar文件
  3. 从源目录中删除(即删除)匹配的文件
  4. 为了简单起见,我打算使用硬编码的目录和文件模式列表

    这是我到目前为止所提出的:

    #!/bin/bash
    
    filenames[0]='/home/user1/*.foo'
    filenames[1]='/some/otherpath/*.fbar'
    
    for f in ${filenames[@]}
       do
          echo "$f"
    done
    

    然而,我不知道如何从这一点开始。具体来说,我需要帮助:

    1. 如何为匹配模式$ f
    2. 的文件添加球
    3. 如何一次性将匹配文件的整个列表(即所有目录)添加到tar文件中
    4. 关于删除文件,我想简单地遍历上面步骤2中获得的整个列表,并且'rm'是实际文件 - 是否有更好/更快/更优雅的方式?

      PS:

      我在Ubuntu 10.0.4 LTS上运行它

2 个答案:

答案 0 :(得分:0)

tar(1)支持--remove-files选项,该选项会在将文件添加到存档后删除这些文件。

根据您尝试使用shell globs进行的操作,您可能无视那里的所有额外工作。试试这个:

tar cf /dir/archive.tar --remove-files /home/user1/*.foo /some/otherpath/*.fbar

答案 1 :(得分:0)

如果要使用循环,因为您有许多目录,可以使用-r选项附加到tar文件。在将文件添加到存档后,您还可以使用--remove-files删除文件。

filenames[0]='/home/user1/*.foo'
filenames[1]='/some/otherpath/*.fbar'

for f in "${filenames[@]}"
do
   tar -rvf --remove-files foo.tar $f
done

如果您没有--remove-files选项,请在rm $f命令后使用tar