web-dev-qa-db-ja.com

複数のテキストファイルを作成日順に並べられた1つのテキストファイルに結合する方法

私は初心者なので、助けてください:

私は、Scratchを使用してiPhoneにジャーナルを保持し、作成したすべてのメモをDropboxに保存されている別の.txtファイルに出力します。

私はこれをUbuntu 14.04システムと同期しているので、ファイルにはすべてのテキストファイルが保存されているフォルダーがあります:

/ home/stuart/Dropbox/Scratch

これらのすべてのファイルを1つのファイルに連結するコマンドを実行したいのですが、次の条件があります。

  1. 作成日順(最も古いファイルが最初)
  2. ファイルの内容の前の別の行にファイルの日付を印刷します
  3. 各ファイルの後にある種の区切り線が続く空白行を含める

したがって、出力ファイルには次のようなエントリがあります。

12-01-2014 11:01 AM:
イスラエルのコーヒーショップ。外のサインは次のとおりです。
「コーヒー」-9シェケル
「コーヒーください」-8シェケル
「おはようございます、コーヒーをお願いできますか?」 -7シェケル

-
25-01-2014 11:01 AM:
エゴを上回ることはできません-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として実行する必要がありますか?

4
Stuart Clough

pythonスクリプトを使用して、サイドノートを1つ付けて実行できます。作成日はほぼ終了するため、作成日の代わりに変更日を使用しました確かにreal作成日とは一致しません:ファイルがコンピューターにコピーされた日付ですが、コピー中に変更日は変更されていないようです(@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)
3
Jacob Vlijm

これがbashソリューションです。 ext4 file system を使用している場合は動作するはずです。 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
c0rp