【问题标题】:Bash shell script to glob files in several directories, add to an archive and remove original fileBash shell 脚本到多个目录中的 glob 文件,添加到存档并删除原始文件
【发布时间】:2011-03-24 10:15:11
【问题描述】:

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

  1. 枚举目录中与指定模式匹配的文件列表
  2. 创建一个包含匹配文件的 tar 文件
  3. 从源目录中删除(即删除)匹配的文件

为了简单起见,我打算使用目录和文件模式的硬编码列表

这是我目前想出的:

#!/bin/bash

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

for f in ${filenames[@]}
   do
      echo "$f"
done

但是,我不确定从现在开始如何进行。具体来说,我需要以下帮助:

  1. 如何 glob 匹配模式 $f 的文件
  2. 如何一次性将匹配文件的整个列表(即来自所有目录)添加到 tar 文件中

关于删除文件,我想简单地遍历上面第 2 步中获得的整个列表,然后“rm”实际文件 - 有没有更好/更快/更优雅的方法?

PS:

我在 Ubuntu 10.0.4 LTS 上运行它

【问题讨论】:

    标签: bash


    【解决方案1】:

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

    根据您尝试对 shell glob 执行的操作,您可能也可以忽略在那里执行所有额外的工作。试试这个:

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

    【讨论】:

      【解决方案2】:

      如果您想使用循环,因为您有很多目录,您可以使用-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 选项,请在tar 命令之后使用rm $f

      【讨论】:

      • 我猜如果存档不存在就会创建?我猜是这种情况,因为我(显然?)不能在循环中使用 c 选项 - 因为文件将在每次迭代时被覆盖......
      • @oompahloompah 是的,如果它不存在,它将创建。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      相关资源
      最近更新 更多