【问题标题】:gzipping up a set of directories and creating a tar compressed filegzip 压缩一组目录并创建一个 tar 压缩文件
【发布时间】:2011-03-21 10:42:56
【问题描述】:

我的 bash fu 不是应有的样子。

我想创建一个小批处理脚本,它将目录列表复制到一个新的 zip 文件中。

我能想到的证明文件列表的方法有(至少)两种:

  1. 从文件中读取(比如 config.txt)。该文件将包含要压缩的目录列表或

  2. 将列表直接硬编码到 bash 脚本中

第一个选项似乎更直接(虽然不那么优雅)。

我面临的两个问题是我不确定如何执行以下操作:

  • 向 shell 脚本提供目录列表
  • 遍历目录列表

有人可以建议几行,我该怎么做?

顺便说一句,我在 Ubuntu 10.0.4 上运行

【问题讨论】:

    标签: bash ubuntu shell gzip


    【解决方案1】:

    我经常使用:

    tar -cv Folder1 Folder2 | gzip > Folders.tar.gz
    

    【讨论】:

      【解决方案2】:

      如果您正在寻找压缩目录,以下命令可以提供帮助。

      pbzip2 使用并行实现压缩目录

      tar cf <outputfile_name> --use-compress-prog=pbzip2 <directory_name>
      

      【讨论】:

        【解决方案3】:

        当您将文件/目录名称写入文件时,只需使用空字节作为分隔符。这样您就不必担心文件名中的空格、换行符等!

        printf "%s\000" */ > listOfDirs.txt    # alternative: find ... -print0 
        
        while IFS="" read -r -d '' dir; do command ls -1abd "$dir"; done < listOfDirs.txt
        
        tar --null -czvf mytar.tar.gz --files-from listOfDirs.txt 
        

        【讨论】:

          【解决方案4】:

          您可以在命令行上创建一个 gzipped tar,如下所示:

          tar czvf mytar.tar.gz dir1 dir2 .. dirN
          

          如果您想在 bash 脚本中执行此操作并将目录作为参数传递给脚本,那么这些参数将在 $@ 中结束。那么你有:

          tar czvf mytar.tar.gz "$@"
          

          如果这是在脚本中(比如说myscript.sh),你可以这样称呼它:

          ./myscript.sh dir1 dir2 .. dirN
          

          如果您想从列表中读取(您的选项 1),您可以这样做(如果目录名称中有空格,这将不起作用):

          tar czvf mytar.tar.gz $(<config.txt)
          

          【讨论】:

          • @peter:感谢您的回答 - 这几乎让我到达了我想去的地方。但我很懒,不想每次都在命令行输入相同的文件列表(这也容易出错)——这就是为什么我想“硬编码”目录列表——无论是在脚本本身中,还是单独保存在外部文件中。你能解释一下我如何修改上面的命令来做到这一点吗?
          • 甜蜜!。这看起来像我想要做的。我必须说语法看起来很可怕。我最好给自己买一本 bash 编程书——快! :)
          • @morpheus:除了买书,我还推荐阅读man bash(在本例中是Command Substitution 下的部分)。另请注意,带有 config.txt 的解决方案不适用于名称中带有空格的目录。
          • 呃,当我尝试创建一个 bash 脚本来运行命令时,我收到以下错误:“bash: ./work-backup.sh: /usr/bin/bash: bad interpreter:无此文件或目录”。我的脚本以 #!/usr/bin/bash 行开头...有什么想法吗?
          • @morpheus:这意味着在路径/usr/bin/bash 中找不到bash。您可以在命令行中键入which bash 以找出bash 在您的系统中的位置。
          【解决方案5】:

          您可以导出像 DIRECTORIES="DIR1 DIR2 DIR3 ...." 这样的变量 在脚本中,您需要使用变量,例如 tar czvf $DIRECTORIES

          【讨论】:

            【解决方案6】:

            创建两个文件: 文件列表 - 放置所有必需的目录(一个在单行)

            并创建一个简单的 bash 脚本:

                #!/bin/bash
            
            
            for DIR in `cat filelist` 
            do 
                if [ -d $DIR ] 
                then
                    echo $DIR
                fi
            done
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-28
              • 1970-01-01
              • 2020-06-25
              • 2012-09-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-14
              • 1970-01-01
              相关资源
              最近更新 更多