Linux - 递归列出所有zip文件并仅保留最新修改的5个文件并删除其余文件

时间:2016-01-08 08:55:44

标签: linux shell unix

在命令行中,我们如何以递归方式找出目录及其子目录中的所有zip文件,并仅保留最新修改的5个文件并删除剩余的文件。

文件路径如下所示:

  1. basedirectory / 2015/12/18 / abc.zip
  2. basedirectory /十二分之二千零十五​​/ 18 / def.zip
  3. basedirectory / 2015/12/18 / ghi.zip
  4. basedirectory / 2015/12/18 / jkl.zip
  5. basedirectory / 2015/12/08 / mno.zip
  6. basedirectory / 2015/12/08 / pqr.zip
  7. basedirectory / 2015/12/08 / stu.zip
  8. basedirectory / 2015/12/07 / stu.zip

1 个答案:

答案 0 :(得分:0)

我有办法,但它涉及几个(简单)步骤。这可能是更优雅的方式,但这就是我如何知道。它们来自几个来源,我在答案的最后列出了这些来源。您将使用已安装的公用事业cdfindlsrmhead。它将涉及创建和执行两个bash脚本。

  1. 打开终端并使用cd ~/basedirectory
  2. 切换到您的基本目录

    这将设置以下命令。请务必留在此目录中以获取其余命令。

    1. 键入find pwd -name *.zip > find_zip
    2. 这将创建所有zip文件的列表,其中包含相对于您更改的目录的完整路径。它不是将它们打印到屏幕上,而是将它们写入您更改的目录中的find_zip文件。

      1. 输入cp find_zip remove_old_zip
      2. 这将创建第二个重复文件,稍后您将使用该文件删除旧文件。

        1. 在您喜欢的文本编辑器中打开find_zip文件。如果你不习惯使用任何,你可以使用gedit。如果您没有,请使用sudo apt-get udpate && sudo apt-get install gedit

        2. 进行安装
        3. 执行以下搜索和替换(在gedit中):搜索\n,并将其替换为" \\n"

        4. 这会将文件夹列表放在引号内。第一个反斜杠在每行的末尾放置一个“\”,这意味着继续读取下一行并一起执行所有代码。 \ n保留行结尾。最后一个“在每行的开头放一个引号。你需要引号来转义特殊字符,比如'和(可能在你的文件名中。

          1. 在文件顶部创建2个新行并输入:

            !/斌/庆典

            ls -lt \

          2. 第一行将您的文件转换为bash脚本。第二行将列出您使用find命令找到的所有文件,并按日期排序。

            1. 在文件底部创建一个新行,然后键入:| head -5。保存并退出文件。
            2. |是一个“管道”,它将获取ls创建的有序文件列表的输出并将其提供给head命令。 head命令将仅列出最近修改的5个文件,并在屏幕上显示或打印它们。

              作为步骤5-7的结果,您的文件应该如下所示:

              basedirectory/2015/12/18/abc.zip
              basedirectory/2015/12/18/def.zip
              basedirectory/2015/12/18/ghi.zip
              basedirectory/2015/12/18/jkl.zip
              basedirectory/2015/12/08/mno.zip
              basedirectory/2015/12/08/pqr.zip
              basedirectory/2015/12/08/stu.zip
              basedirectory/2015/12/07/stu.zip
              

              到此:

              #!/bin/bash
              ls -lt \
              basedirectory/2015/12/18/abc.zip \
              basedirectory/2015/12/18/def.zip \
              basedirectory/2015/12/18/ghi.zip \
              basedirectory/2015/12/18/jkl.zip \
              basedirectory/2015/12/08/mno.zip \
              basedirectory/2015/12/08/pqr.zip \
              basedirectory/2015/12/08/stu.zip \
              basedirectory/2015/12/07/stu.zip \
              | head -5
              
              1. 在终端输入bash find_zip。使用新发现的5个最新文件列表,打开在步骤3中创建的remove_old_zip文件。
              2. 您还将此文件转换为bash脚本,但除了五个最新文件外,它将删除所有文件。

                1. 删除包含您要保留的5个文件的remove_old_zip文件中的行。

                2. 执行以下搜索和替换(在gedit中):搜索\n,并将其替换为" \\n"

                3. 这与步骤5相同。

                  1. 在文件顶部创建2个新行并输入:

                    !/斌/庆典

                    rm \

                  2. 这与第6步类似,只是rm会删除仍然列出的文件。

                    1. 删除remove_old_zip文件最后一行的最终\。保存并退出。

                    2. 输入bash remove_old_zip

                    3. 输入rm find_zip remove_old_zip。 这将删除两个脚本,这些脚本现在已被删除,因为文件已被删除。

                    4. 来源: How can I list (ls) the 5 last modified files in a directory?

                      http://www.geekinterview.com/talk/758-how-to-continue-to-next-line.html

                      List files recursively in Linux CLI with path relative to the current directory