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

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

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

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

/ home / stuart / Dropbox / Scratch

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

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

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

12-01-2014 11: 01 AM: кафе в Израиле. Знак на улице гласит: «Кофе» - 9 шекелей «Кофе, пожалуйста» - 8 шекелей «Доброе утро, мог бы я угостить кофе?» - 7 shekel - 25-01-2014 11:01 AM: Вы не можете превзойти свое эго - оле Гуннар солскьяр -

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

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

Любая помощь была высоко оценена!

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

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

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

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

- 25-01-2014 11:01 утра: вы не можете превзойти свое эго - оле Гуннар solskjaer

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

1
задан 29 September 2014 в 22:03

1 ответ

Вот решение 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

Этот скрипт использует как дату создания, так и модификацию

Источники

О дате создания Дата создания в других файловых системах Сценарий для поиска даты создания
2
ответ дан 24 May 2018 в 03:18
  • 1
    Можете ли вы подтвердить, что он работает, если вы копируете файлы в новый каталог? В соответствии с этим unix.stackexchange.com/a/91200 он не работает, даже если файловая система поддерживает его. – Jacob Vlijm 29 September 2014 в 14:16
  • 2
    @JacobVlijm здесь простой тест. он работает, diff показывает, что время создания отличается после копирования файлов – c0rp 29 September 2014 в 14:31
  • 3
    @cOrp Но это точно проблема, она не должна. Файлы копируются с сервера Dropbox на его компьютер, поэтому дата создания неверна. Лучше возьмите мод. date, тогда , который хранится в файле , а затем дата создания , которая хранится в файловой системе и, следовательно, не копируется. В большинстве случаев при записи заметок мода. дата будет достаточно близка к (реальной) дате создания, чтобы использовать ее в скрипте, который ищет OP. – Jacob Vlijm 29 September 2014 в 15:48
  • 4
    @JacobVlijm вы правы, в этом случае дата изменения более точна – c0rp 29 September 2014 в 17:19
  • 5
    Должен признаться, я не знал до этого вопроса :) – Jacob Vlijm 29 September 2014 в 17:42

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

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