web-dev-qa-db-fra.com

Comment combiner plusieurs fichiers texte en un fichier texte trié par date de création?

Je suis un débutant alors aide s'il vous plaît:

Je garde un journal sur mon iPhone en utilisant Scratch, qui affiche toutes les notes que je crée dans un fichier .txt séparé stocké dans Dropbox.

Je l'ai synchronisé avec mon système Ubuntu 14.04, donc dans mes fichiers, j'ai un dossier avec tous les fichiers texte stockés ici:

/ home/stuart/Dropbox/Scratch

Je souhaite exécuter une commande qui concatène tous ces fichiers en un seul, avec les conditions suivantes:

  1. Classés par date de création (premier fichier en premier)
  2. Imprimer la date du fichier sur une ligne séparée avant le contenu du fichier
  3. Inclure une ligne vierge suivie d'une sorte de ligne de séparation après chaque fichier

Donc, le fichier de sortie a des entrées qui ressemblent à ceci:

12-01-2014 11:01:
Un café en Israël. Le signe extérieur se lit comme suit:
"Café" - 9 shekel
"Café s'il vous plaît" - 8 shekel
"Bonjour, pourrais-je prendre un café s'il vous plaît?" - 7 shekel

-
25-01-2014 11:01:
Vous ne pouvez pas surpasser votre ego - ole Gunnar solskjaer

-

Etc. J'avais l'habitude d'utiliser une application différente qui effectuait ce type d'ajout automatique, mais je ne sais pas comment le répliquer.

J'ai examiné beaucoup de fichiers d'aide ici, mais je n'ai trouvé aucun élément pouvant aider à la sortie que j'ai en tête.

Toute aide grandement appréciée!


PLUS D'INFORMATIONS

J'ai essayé de créer le script suggéré ci-dessous et j'ai suivi les étapes. Cependant, j'obtiens cette réponse:

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

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

bash: new_concatenated_file: autorisation refusée

Dois-je en quelque sorte le lancer en tant que sudo?

4
Stuart Clough

Cela peut être fait avec un script python, avec une seule remarque: j'ai pris le date de modification au lieu du date de création, car la date de création sera presque ne correspond certainement pas à la réelle date de création: il s'agit de la date à laquelle le fichier a été copié sur l'ordinateur, tandis que la date de modification semble inchangée pendant la copie (voir la discussion à la réponse @cOrps). Vous devrez voir si cela fonctionne dans votre situation.

Si cela vous convient, vous pouvez utiliser le script ci-dessous pour créer un fichier combiné avec vos notes. Il lit les notes, les trie et les ajoute à un fichier texte (le crée s'il n'existe pas).

La bonne nouvelle est que vous pouvez ajouter vos nouvelles notes au même fichier sans écraser les anciennes.

Exemple de sortie:

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.

----------

Comment utiliser:

  • Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom add_notes.py
  • changez les répertoires pour files_dir (où sont vos notes) et le fichier dans lequel vous souhaitez enregistrer les notes: combined_file (le script crée le fichier s'il n'existe pas)
  • exécutez le script dans une fenêtre de terminal en tapant la commande suivante:

    python3 /path/to/add_notes.py
    

Le scénario:

#!/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)
3
Jacob Vlijm

Voici une solution bash. Cela devrait fonctionner si vous utilisez le système de fichiers ext4 . Il utilise la date de création du fichier que ext4 enregistre dans le champ crtime.

Créez ce script n'importe où. Disons my_concat dans votre répertoire $HOME (dans votre cas, il s'agit de /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

Rendez-le exécutable:

chmod +x $HOME/my_concat

Allez maintenant dans votre dossier $HOME et lancez le script. Script vous demandera votre mot de passe car il utilise Sudo:

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

Maintenant, lisez new_concatenated_file en utilisant un éditeur:

gedit new_concatenated_file

Ce script utilise à la fois la date de création et la date de modification , après comparaison, il faut le plus ancien.

Sources

  1. date de création
  2. date de création dans d'autres systèmes de fichiers
  3. Script pour trouver la date de création
2
c0rp