Wie kann ich ein Formular mit einem Shell / Bash-Skript unter Linux aktualisieren?

0

Ich frage mich, ob es möglich ist, Werte wie nachstehend beschrieben wiederzugeben. Die Situation ist - es gibt zu viele "doc" -Dateien mit dem Namen "PLCI507_01234567.doc" und ein Formular in einer Textdatei mit dem Namen "form.txt" sieht wie folgt aus;

--------------------------------------------------------------------
Date: 
Count :
--------------------------------------------------------------------
ID   | Host    | md5sum               | Created   | 
--------------------------------------------------------------------
       |         |                    |           |
     |         |                      |           | 
--------------------------------------------------------------------

Ich kann bereits Dateien für jedes Dokument im gleichen Format erstellen. Jetzt möchte ich alle Informationen in einem einzigen Formular. Das Formular sollte also mit den Dateiinformationen aktualisiert werden. Dateiname, Erstellungsdatum, MD5-Summe usw.

md5sum = md5sum PLCI507_01234567.doc | awk '{ print $1 }' #sum of each file

Erstellt = date +"%d/%m/%Y" #date of form update

Die aktualisierte form.txt sollte wie folgt aussehen.

--------------------------------------------------------------------
Date: 4/14/2011 
Count : 4 
--------------------------------------------------------------------
ID     | Host    | md5sum                           | Created    | 
--------------------------------------------------------------------
01234567 | PLCI507 | 2b3dbf39a65eb140a163401001e32fb2 | 14/03/2011 | 
01234560 | PLCI512 | 7aa31c83cc1b78fa9ae60460e1eb4731 | 22/04/2011 |
--------------------------------------------------------------------

Bitte helfen Sie mir dabei. Ich hoffe, dass es einen Weg gibt, dies zu tun.

Vielen Dank!!

Himalay
quelle

Antworten:

1

Hier ist ein Skript, das diese Datei generiert und mit printf gut ausgeben kann.

Nenne es einfach so: ./script_name.sh /path/to/docfiles/

#!/usr/bin/env bash

docFiles=$(find "$1" -iname '*.doc')
numFiles=$(echo -e "$docFiles" | wc -l)

sep="--------------------------------------------------------------------------------"
Date="Date: $(date +'%d/%m/%Y')"
Count="Count : $numFiles"

# Start printing file
echo $sep
echo $Date
echo $Count
echo $sep
printf ' %-10s | %-10s | %-33s | %-15s |\n' "ID" "Host" "md5sum" "Created"
echo $sep


for file in $docFiles
do
    docMD5=$(md5sum "$file" | awk '{ print $1 }')
    # This was a bit unclear in the question...
    # if you want file mtime instead... use something like:
    #docDate=$(stat -c %d/%m/%Y "$file")
    #docDate=${docDate%% *}

    docID=$(basename "$file" | sed -e 's/^\(.*\)_.*/\1/')
    docHost=$(basename "$file" | sed -e 's/^.*_\(.*\)\.doc$/\1/')

    # Use today's date
    docDate=$(date +"%d/%m/%Y")
    printf ' %-10s | %-10s | %-33s | %-15s |\n' "$docID" "$docHost" "$docMD5" "$docDate"
done

echo $sep
  • Kopieren Sie mit Ihrem Lieblingseditor den gewünschten Dateinamen.
  • chmod +x script_name.sh
  • ./script_name.sh /path/to/docfiles/
TrinitronX
quelle
funktioniert gut, aber wenn ich dieses Skript das nächste Mal im gleichen Verzeichnis ablaufe, werden auch Ergebnisse für das alte generiert. :( und wenn ich das Ergebnis auf eine Textkachel schiebe, erstellt es beim nächsten Mal eine neue Datei, aber auch alte Informationen. .. eine Lösung, um alte Dateien zu vermeiden und nur einzelne Dateien zu aktualisieren?
Himalay
Wie genau soll es funktionieren? Wenn Sie es ein zweites Mal für alle Dateien im Verzeichnis ausführen ... sollte es nur nach neuen Dateien suchen? Was ist mit geänderten Dateien? Soll das Feld "Created" mtime, ctime oder einfach sein? date +"%d/%m/%Y"? Es hört sich an, als wollten Sie eine einzelne Datei aktualisieren.
TrinitronX
Das Verzeichnis enthält viele Dateien, die jede Minute hochgeladen werden. Ja, es sollte nur nach neuen Dateien suchen und dann die Datei aktualisieren. Ich denke, es ist besser mit Created mtime oder md5sum zu überprüfen?
Himalay
1

Anscheinend benötigen Sie eine Schleife, um auf jede DOC-Datei zuzugreifen

i=0
for f in *.doc
do
    ((i++))
    f=$(basename "$f")

    # process each file
    # ...

    form_content="${form_content}$f_id | $f_host | $md5sum | $Created |\n"
done

Wenn .doc-Dateien einen Namen mit fester Länge haben, können Sie Host / ID über entfernen Parameter Expansion.

f_host="${f:0:7}"
f_id="${f:8:8}"

Schließlich geben Sie das Ergebnis wie folgt aus:

echo "--------------------"
echo "Date: `date +%d/%m/%Y`"
echo "Count: $i"
echo "--------------------"
echo "ID | Host | md5sum | Created |"
echo "--------------------"
echo -e "$form_content"
echo "--------------------"
LiuYan 刘研
quelle