Как объединить несколько текстовых файлов в один текстовый файл, упорядоченный по дате создания?

Я новичок, поэтому, пожалуйста, помогите:

Я веду журнал на своем iPhone, используя Scratch, который выводит все сделанные мной заметки в отдельный файл .txt, хранящийся в Dropbox.

У меня это синхронизировано с моей системой Ubuntu 14.04, поэтому в моих Файлах у меня есть папка со всеми текстовыми файлами, хранящимися здесь:

/ home / stuart / Dropbox / Scratch

Я хочу запустить команду, которая объединит все эти файлы в один файл со следующими условиями:

  1. Упорядочено по дате создания (самый ранний файл - первый)
  2. Распечатать дату файл в отдельной строке перед содержимым файла
  3. Включите пустую строку, за которой следует некая строка-разделитель после каждого файла

Таким образом, в выходном файле есть записи, которые выглядят примерно так: это:

12-01-2014 11:01 AM:
Кафе в Израиле. Надпись снаружи гласит:
«Кофе» - 9 шекелей
«Кофе, пожалуйста» - 8 шекелей
«Доброе утро, можно мне кофе, пожалуйста?» - 7 шекелей

-
25-01-2014 11:01 AM:
Вы не можете превзойти своего эго-оле Гуннара Сольскьяера

-

И так далее. Раньше я использовал другое приложение, которое автоматически добавляло этот вид, но я не знаю, как его воспроизвести.

Я просмотрел здесь много справочных файлов, но не нашел ни одного, который мог бы помочь с выводом, который я имею в виду.

Любая помощь очень ценится!


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Я попытался создать сценарий, предложенный ниже, и следовал инструкциям. Однако я получаю этот ответ:

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

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

bash: new_concatenated_file: В доступе отказано

Нужно ли каким-либо образом запускать его как sudo?

4
задан 29 September 2014 в 21:03

2 ответа

Это может быть сделано со сценарием Python с одной заметкой на полях: Я взял дату модификации вместо даты создания, так как дата создания не будет почти наверняка соответствовать реальной дате создания: это - дата, файл был скопирован в компьютер, в то время как дата модификации кажется неизменной во время копирования (см. обсуждение в ответе @cOrps). Необходимо будет видеть, работает ли это в ситуации.

Если это приемлемо для Вас, можно использовать сценарий ниже для создания объединенного файла с примечаниями. Это читает примечания, сортирует их и добавляет их к текстовому файлу (создает его, если это не существует).

Хорошие новости - то, что можно добавить новые примечания в тот же файл, не перезаписывая старые.

Пример произвел:

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.

----------

Как использовать:

  • Скопируйте сценарий ниже в пустой файл, сохраните его как add_notes.py
  • измените каталоги для files_dir (где Ваши примечания), и файл, в котором Вы хотите сохранить примечания: combined_file (сценарий создает файл, если он не существует),
  • запустите скрипт в окне терминала путем ввода команды:

    python3 /path/to/add_notes.py
    

Сценарий:

#!/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
ответ дан 29 September 2014 в 21:03

Вот решение для удара. Это должно работать при использовании ext4 файловой системы. Это использует дату создания файла это ext4 хранилище в crtime поле.

Создайте этот сценарий где угодно. Скажем, my_concat в Вашем $HOME каталог (в Вашем случае это /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

Сделайте это исполняемым файлом:

chmod +x $HOME/my_concat

Теперь перейдите к Вашему $HOME папка и запущенный скрипт. Сценарий спросит Вас Ваш пароль, потому что сценарий использует sudo:

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

Теперь читайте new_concatenated_file использование некоторого редактора:

gedit new_concatenated_file

Этот сценарий использует и дату создания, и измените дату после сравнения, это берет самый ранний.

Источники

  1. О дате создания
  2. Дата создания в других файловых системах
  3. Сценарий для нахождения даты создания
2
ответ дан 29 September 2014 в 21:03

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

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