Como combinar vários arquivos de texto em um arquivo de texto ordenado por data criado?

4

Sou novato, por favor ajude:

Eu mantenho um diário no meu iPhone usando o Scratch que exibe todas as notas que faço em um arquivo .txt separado armazenado no Dropbox.

Eu tenho isso sincronizado com o meu sistema Ubuntu 14.04, então nos meus arquivos eu tenho uma pasta com todos os arquivos de texto armazenados aqui:

/ home / stuart / Dropbox / Scratch

Eu quero executar um comando que concatene todos esses arquivos em um arquivo, com as seguintes ressalvas:

  1. Ordenado por data criada (primeiro arquivo primeiro)
  2. Imprime a data do arquivo em uma linha separada antes do conteúdo do arquivo
  3. Inclua uma linha em branco seguida por algum tipo de linha separadora após cada arquivo

Assim, o arquivo de saída tem entradas parecidas com esta:

12-01-2014 11:01 AM:
A coffee shop in Israel. The sign outside reads:
"Coffee" - 9 shekel
"Coffee please" - 8 shekel
"Good morning, could I have a coffee please?" - 7 shekel

--
25-01-2014 11:01 AM:
You cannot outperform your ego - ole Gunnar solskjaer

--

E assim por diante. Eu costumava usar um aplicativo diferente que fazia esse tipo de acréscimo automático, mas não tenho ideia de como replicá-lo.

Eu examinei muitos dos arquivos de ajuda aqui, mas não encontrei nenhum que possa ajudar com a saída que tenho em mente.

Qualquer ajuda muito apreciada!

MAIS INFORMAÇÃO

Eu tentei criar o script sugerido abaixo e segui os passos. No entanto, recebo esta resposta:

stuart@StudioClough:/home$ chmod +x $HOME/my_concat

stuart@StudioClough:/home$ ./my_concat /home/stuart/Dropbox/Scratch > new_concatenated_file

bash: new_concatenated_file: Permission denied

Eu tenho que de alguma forma executá-lo como sudo?

    
por Stuart Clough 29.09.2014 / 04:13

2 respostas

3

Isso pode ser feito com um script python, com um sidenote: eu tirei a data de modificação ao invés da data de criação , já que a data de criação quase certamente não corresponderá a data de criação real : é a data em que o arquivo foi copiado para o computador, enquanto a data de modificação parece inalterada durante a cópia (consulte a discussão na resposta @cOrps). Você terá que ver se funciona na sua situação.

Se isso for aceitável para você, você pode usar o script abaixo para criar um arquivo combinado com suas anotações. Ele lê as notas, classifica-as e as anexa a um arquivo de texto (cria-o, se não existir).

A boa notícia é que você pode anexar suas novas anotações ao mesmo arquivo sem sobrescrever as antigas.

Exemplo de saída:

Mon Sep 29 08:48:31 2014
This is my first note.
As you can read, I am not really awake yet.

----------
Mon Sep 29 09:04:06 2014
It is really time I am going to eat something.
I am a bit hungry.
Making it a bit longer.

----------

Como usar:

  • Copie o script abaixo em um arquivo vazio, salve-o como add_notes.py
  • altere os diretórios para files_dir (onde estão suas anotações) e o arquivo no qual você deseja salvar as anotações: combined_file (o script cria o arquivo se ele não existir)
  • execute o script em uma janela do terminal digitando o comando:

    python3 /path/to/add_notes.py
    

O script:

#!/usr/bin/env python3

import os
import time
import subprocess

# --------------------------------------------------------
files_dir = "/path/to/your/textfiles"
combined_file = "/path/to/your/combined/file.txt"
# ---------------------------------------------------------
notes = []

if not os.path.exists(combined_file):
    subprocess.Popen(["touch", combined_file])

def read_file(file):
    with open(file) as note:
        return note.read()

def append_file(combined_file, text):
    with open(combined_file, "a") as notes:
        notes.write(text)

for root, dirs, files in os.walk(files_dir):
    for name in files:
        subject = root+"/"+name
        cr_date_text = time.ctime(os.path.getmtime(subject))
        cr_date_n = os.stat(subject).st_mtime
        notes.append((cr_date_n, cr_date_text, subject))

notes.sort(key=lambda x: x[0])

for note in notes:
    text = note[1]+"\n"+read_file(note[2])+"\n"+"-"*10+"\n"
    append_file(combined_file, text)
    
por Jacob Vlijm 29.09.2014 / 08:47
2

Aqui está uma solução bash. Ele deve funcionar se você estiver usando o sistema de arquivos ext4 . Está usando a data de criação do arquivo que ext4 armazena no campo crtime .

Crie este script em qualquer lugar. Digamos que my_concat no seu diretório $HOME (no seu caso é /home/stuart ):

#!/bin/bash

get_crtime() {
    for target in "${@}"; do
        inode=$(ls -di "${target}" | cut -d ' ' -f 1)
        fs=$(df  --output=source "${target}"  | tail -1)
        crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
        grep -oP 'crtime.*--\s*\K.*')
        printf "%s\n" "${crtime}"
    done
}

get_epoch_crtime(){
    date --date "$(get_crtime $1)" +%s
}

get_epoch_mtime() {
    stat -c %Y $1
}

# takes two date as input, returns earlier date
get_earlier_time(){
    if [[ "$1" -lt "$2" ]]; then
        echo $(date -d @$1 +%m/%d/%Y:%H:%M:%S)
    else
        echo $(date -d @$2 +%m/%d/%Y:%H:%M:%S)
    fi
}

if [ $# != 1 ]; then
    echo "Required only one argument - full path to folder"
    echo "Usage example:"
    echo "$0 /var/log/syslog/"
    exit 1
fi

if [ -d "$1" ]; then
    cd $1
    for file in *
    do 
        echo $(get_earlier_time $(get_epoch_crtime $file) $(get_epoch_mtime $file))
        cat $file
        echo -e "\n-------"
    done
else
    echo "The folder specified is not exists ($1). Please enter full path"
fi

Torne-o executável:

chmod +x $HOME/my_concat

Agora vá para a pasta $HOME e execute o script. O script perguntará sua senha porque o script usa sudo :

./my_concat /home/stuart/Dropbox/Scratch > new_concatenated_file

Agora leia new_concatenated_file usando algum editor:

gedit new_concatenated_file

Este script usa as duas data de criação e data de modificação , após a comparação demora a primeira.

Fontes

  1. Sobre a data de criação
  2. Data de criação em outros sistemas de arquivos
  3. Script para encontrar a data de criação
por c0rp 29.09.2014 / 11:00