создайте .tar файл всех последних файлов в каталогах

Я нахожусь в каталоге 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 
2
задан 18 November 2014 в 09:42

3 ответа

Решение для 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()
2
ответ дан 2 December 2019 в 02:24

"Последний" твердо определить. Я думаю, что можно использовать find двумя способами здесь:

  1. Список все файлы, измененные позже, чем другой файл:

    find . -type f -newer b/1
    
  2. Список все файлы изменили [меньше чем 113] несколько минут назад (скажите 10):

    find . -type f -mmin -10
    

Выбирают.

1
ответ дан 4 August 2019 в 09:20

Можно использовать:

ls -tl | sed -n 2p

это должно возвращать имя и детали новейшего файла в каталоге.

1
ответ дан 4 August 2019 в 09:20

Другие вопросы по тегам:

Похожие вопросы: