Я нахожусь в каталоге A. Это имеет много подкаталогов B, C, D. У каждого подкаталоги будет список файлов. Я должен создать a .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
Мне нужен a .tar
файл, который содержит (b/1, c/4, d/7). 1, 4, 7 последние файлы в каталогах. Я пытался сделать то использование find
и sort -r
. Но это печатает все файлы в каталогах.
find . -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
Решение для Python сделать задание полностью. Это создает a 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()
"Последний" твердо определить. Я думаю, что можно использовать find
двумя способами здесь:
Список все файлы, измененные позже, чем другой файл:
find . -type f -newer b/1
Список все файлы изменили [меньше чем 113] несколько минут назад (скажите 10):
find . -type f -mmin -10
Выбирают.
Можно использовать:
ls -tl | sed -n 2p
это должно возвращать имя и детали новейшего файла в каталоге.