cria um arquivo .tar de todos os arquivos mais recentes nos diretórios

2

Eu estou em um diretório A. Isso tem muitos subdiretórios B, C, D. Cada subdiretório terá uma lista de arquivos. Eu preciso criar um arquivo .tar de todo o arquivo mais recente em cada subdiretório.

Exemplo:

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

Eu preciso de um arquivo .tar que contenha (b / 1, c / 4, d / 7). 1, 4, 7 são os arquivos mais recentes nos diretórios. Eu tentei fazer isso usando find e sort -r . Mas isso imprime todos os arquivos nos diretórios.

find . -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r 
    
por Raj 17.11.2014 / 22:01

3 respostas

2

Uma solução python para fazer o trabalho completamente. Ele cria um arquivo tar.gz dos arquivos mais recentes de todos os subdiretórios de um determinado diretório.

O script

#!/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()

Copie o script em um arquivo vazio, defina na seção head do script o diretório, contendo os subdiretórios ( files_dir = ) e o caminho para o arquivo tar.gz ( targeted_file = ), e salve-o como get_latest.py .

Execute-o pelo comando:

python3 /path/to/get_latest.py

O que faz

O script primeiro lista todos os (sub) diretórios. Dentro dos subdiretórios, lista os arquivos, classifica-os por data de modificação e adiciona os mais recentes à lista "principal", a ser incluída no arquivo compactado.

Para definir o número de versões a incluir

Para dar à resposta um caractere mais universal, abaixo de uma versão do script na qual você pode definir os números de versões (mais recentes) para incluir no arquivo compactado. Se o número de versões definidas ( versions = ) exceder o número real de arquivos em uma pasta, todos os arquivos serão incluídos.

O script

#!/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()
    
por Jacob Vlijm 17.11.2014 / 23:34
1

"Mais recente" é difícil de definir. Eu acho que você pode usar find de duas maneiras aqui:

  1. Listar todos os arquivos modificados depois de outro arquivo:

    find . -type f -newer b/1
    
  2. Listar todos os arquivos modificados com menos de x minutos atrás (digamos 10):

    find . -type f -mmin -10
    

Faça a sua escolha.

    
por muru 17.11.2014 / 22:13
1

Você pode usar:

ls -tl | sed -n 2p

deve retornar o nome e os detalhes do arquivo mais recente em um diretório.

    
por nux 17.11.2014 / 22:30