我在目录 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 来做到这一点find
。sort -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.gz
(targeted_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
两种方式来使用:
列出晚于另一个文件修改的所有文件:
find . -type f -newer b/1
列出
x
几分钟前修改的所有文件(例如 10 分钟):find . -type f -mmin -10
随意选择。
答案3
您可以使用 :
ls -tl | sed -n 2p
它应该返回目录中最新文件的名称和详细信息。