Как объединить несколько текстовых файлов в один текстовый файл, упорядоченный по дате создания?
Я новичок, поэтому, пожалуйста, помогите:
Я храню журнал на своем iPhone с помощью Scratch, который выводит все сделанные мной заметки в отдельный файл.txt, хранящийся в Dropbox.
Я синхронизировал это с моей системой Ubuntu 14.04, поэтому в моих файлах у меня есть папка со всеми текстовыми файлами, хранящимися здесь:
/ Главная /Stuart / Dropbox / Царапина
Я хочу запустить команду, которая объединит все эти файлы в один файл со следующими условиями:
- Упорядочено по дате создания (сначала самый ранний файл)
- Вывести дату файла в отдельной строке перед содержимым файла
- Включите пустую строку с последующей разделительной строкой после каждого файла
Таким образом, выходной файл имеет записи, которые выглядят примерно так:
12-01-2014 11:01
Кафе в Израиле. Знак снаружи гласит:
"Кофе" - 9 шекелей
"Кофе пожалуйста" - 8 шекелей
"Доброе утро, можно мне кофе, пожалуйста?" - 7 шекелей-
25-01-2014 11:01
Вы не можете превзойти свое эго - ole Gunnar solskjaer-
И так далее. Раньше я использовал другое приложение, которое автоматически добавляло этот вид, но я не знаю, как его воспроизвести.
Я просмотрел много справочных файлов здесь, но я не нашел ни одного, который мог бы помочь с выводом, который я имею в виду.
Любая помощь с благодарностью!
БОЛЬШЕ ИНФОРМАЦИИ
Я попытался создать сценарий, предложенный ниже, и следовал инструкциям. Однако я получаю этот ответ:
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?
2 ответа
Это можно сделать с помощью сценария Python с одной sidenote: я взял дату модификации вместо даты создания, поскольку дата создания почти наверняка не будет совпадать с реальной датой создания: это дата, когда файл был скопирован на компьютер, в то время как дата модификации кажется неизменной во время копирования (см. обсуждение в @cOrps answer). Вы должны будете увидеть, работает ли это в вашей ситуации.
Если это приемлемо для вас, вы можете использовать приведенный ниже скрипт для создания комбинированного файла с вашими заметками. Он читает заметки, сортирует их и добавляет их в текстовый файл (создает его, если он не существует).
Хорошей новостью является то, что вы можете добавлять свои новые заметки в тот же файл, не перезаписывая старые.
Пример вывода:
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)
Вот решение Bash. Это должно работать, если вы используете файловую систему 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
Этот скрипт использует как дату создания, так и дату модификации, после сравнения он берет самую раннюю.