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:
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!
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?
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.
----------
add_notes.py
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
#!/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)
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.