创建目录中所有最新文件的 .tar 文件

创建目录中所有最新文件的 .tar 文件

我在目录 A 中。该目录有很多子目录 B、C、D。每个子目录都有一个文件列表。我需要创建一个包含.tar每个子目录中所有最新文件的文件。

例子:

Directory A :
  Sub directories: B, C, D

Files in directory B : b/1, b/2, b/3
Files in directory C : c/4, c/5, c/6
Files in directory D : d/7, d/8, d/9

我需要一个.tar包含 (b/1, c/4, d/7) 的文件。1、4、7 是目录中的最新文件。我尝试使用 and 来做到这一点findsort -r但这会打印目录中的所有文件。

find . -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r 

答案1

一个可以完全完成这项工作的 Python 解决方案。它tar.gz从给定目录的所有子目录的最新文件创建一个文件。

剧本

#!/usr/bin/env python3

import os
import time
import tarfile

files_dir = "/path/to/directory/with/subdirectories"
targeted_file = "/path/to/latest_files.tar.gz"

latest_files = []
# get the latest files of all sub directories
for root, dirs, files in os.walk(files_dir):
    for dr in dirs:
        dr = root+"/"+dr
        filelist = []
        for item in os.listdir(dr):
            file = dr+"/"+item
            if os.path.isfile(file):
                filelist.append((file, os.stat(file).st_mtime))
        filelist.sort(key=lambda x: x[1])
        if len(filelist) != 0:
            latest_files.append(filelist[-1][0])
# write to latest_files.tar.gz
tar = tarfile.open(targeted_file, "w:gz")
for file in latest_files:
    tar.add(file, arcname = file.split("/")[-1])
tar.close()

将脚本复制到一个空文件中,在脚本的头部部分设置目录,包含子目录(files_dir =)和文件路径tar.gztargeted_file =),然后将其保存为get_latest.py

通过命令运行:

python3 /path/to/get_latest.py

它能做什么

该脚本首先列出所有(子)目录。在子目录中,它列出文件,按修改日期对文件进行排序,并将最新的文件添加到“主”列表中,以包含在压缩文件中。


设置要包含的版本数

为了使答案更具通用性,下面是脚本的一个版本,您可以在其中设置要包含在压缩文件中的(最新)版本的数量。如果设置的版本数(versions =)超过文件​​夹中的实际文件数,则将包含所有文件。

剧本

#!/usr/bin/env python3

import os
import time
import tarfile

files_dir = "/path/to/directory/with/subdirectories"
targeted_file = "/path/to/latest_files.tar.gz"
versions = 1

latest_files = []
# get the latest files of subdirectories
for root, dirs, files in os.walk(files_dir):
    for dr in dirs:
        dr = root+"/"+dr
        filelist = []
        for item in os.listdir(dr):
            file = dr+"/"+item
            if os.path.isfile(file):
                filelist.append((file, os.stat(file).st_mtime))
        filelist.sort(key=lambda x: x[1])
        if len(filelist) != 0:
            for item in filelist[-versions:]:
                latest_files.append(item[0])
# write to latest_files.tar.gz
tar = tarfile.open(targeted_file, "w:gz")
for file in latest_files:
    tar.add(file, arcname = file.split("/")[-1])
tar.close()

答案2

“最新”很难定义。我认为你可以用find两种方式来使用:

  1. 列出晚于另一个文件修改的所有文件:

    find . -type f -newer b/1
    
  2. 列出x几分钟前修改的所有文件(例如 10 分钟):

    find . -type f -mmin -10
    

随意选择。

答案3

您可以使用 :

ls -tl | sed -n 2p

它应该返回目录中最新文件的名称和详细信息。

相关内容