Wenn Datei leer (nicht NULL) dann Datei überschreiben?

5 Antworten

Hallo

Wenn eine .TXT Datei leer ist (also keinen Inhalt) dann soll eine andere .TXT_old (die wiederrum Inhalt hat) die andere Datei überschreiben, aber mit dem selben Endung also nur .TXT

Das ist einfach:

#!/bin/bash

if [ -s datei1.txt ]
  then
    echo "datei1.txt hat einen Inhalt"
else
    cat datei2.txt > datei1.txt
fi
Bitte um schnelle Hilfe

Schneller hast Du es wenn Du solche Fragen in einem passenden IRC stellst.

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

so etwas mache ich mit der Script-Sprache tclsh Etwa so:

#!/bin/bash 
# \
exec tclsh "$0" "$@"

# Dateinamen in Variable eintragen 
set datei   "irgendetwas.TXT"
set old_datei    "etwas_anderes-TXT_old"

#  prüfen, ob beide Dateien vorhanden sind , wenn nicht -> beenden
if { ![file exists  $datei ] || [file exists $ald_datei ] }  {  exit }

# prüfen, ob TXT-Datei leer ist ( size == 0 )  , wenn ja, dann umbenennen ( rename )
# wenn "copy" an Stelle von  "rename" eingesetzt wird, dann bleibt auch die Old-Datei  
# erhalten 

if { [file size $datei ] == "0" } {  file rename  $old_datei $datei 
                                                     puts "Datei $old_datei  wurde in $datei umbenannt" 
                                                     exit
                                                   }
puts "nichts gemacht"
exit 

die tclsh-Shell gibt es auch für Windows, den MAC und Unix

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995
guenterhalt  31.10.2014, 17:06

da habe ich wohl zu schnell geschrieben. So muss die Zeile heißen. Das ! vor [file exists .. liefert "richtig" wenn die Datei nicht existiert

if { ![file exists  $datei ] || ![file exists $old_datei ] }  {  exit }
0
Linuxhase  01.11.2014, 13:13
@guenterhalt

@guenterhalt

file exists

Es geht ja nicht darum ob die Datei existiert sondern ob sie einen Inhalt hat oder nicht.

Am kürzesten wäre es doch wohl so:

test -s datei1.txt || cat datei2.txt > datei1.txt

Linuxhase

0
guenterhalt  01.11.2014, 15:28
@Linuxhase

@Linuxhase das ist nun mal die tclsh

if { [file size $datei ] == "0" }  { .... 

würde mit einem Fehler aussteigen, wenn die Datei nicht existiert,. daher vorher der Test, ob sie es überhaupt gibt.

0

Hallo

am schnellsten geht das afaik mit diesem Kommando:

test -s datei1.txt || cat datei2.txt > datei1.txt

Erklärung:

  • test -s prüft ob die folgend genannte Datei leer ist oder nicht
  • || Die oder Verknüpfung sagt das das was jetzt kommt nur gestartet wird wenn ersteres nicht erfolgreich war.
  • cat datei2.txt gibt den Inhalt von datei1.txt aus
  • > die einfache Ausgabeumleitung leitet den Inhalt um in die
  • datei1.txt
  • Die danach Inhaltlich identisch ist mit datei2.txt

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

Linux hat einen mächtigen Interpreter mit der "bash", welche eigentlich immer automatisch eingerichtet wird. Damit kann man -- meist in Form von Scripten = ausführbare Dateien mit Befehlen -- sogar Programme schreiben!

Ein Beispiel für dich, mit deinem Problem:

if [ -r datei1.txt ]; then wc datei1.txt; else echo nicht vorhanden; fi
touch datei1.txt
if [ -r datei1.txt ]; then wc datei1.txt; else echo nicht vorhanden; fi

Alle Befehle nacheinander ausführen.

Wenn etwas unklar ist, hilft dir "man" weiter!

Den Rest, also die Lösung solltest du aber selbst erledigen!

Woher ich das weiß:eigene Erfahrung – Intensive Beschäftigung hiermit seit etlichen Jahren

Mit der Bash:

#!/bin/bash

fileName="test.txt"

if [ -e $fileName ] && [ ! -s $fileName ]; then
    cp ${fileName}_old $fileName
fi
JS1996 
Fragesteller
 31.10.2014, 13:35

Vielen Dank für die schnelle Antwort. Ich werde beide Scripte testen und schauen welches von beiden besser Funktioniert. Ich würde euch dann nochmal kurz sagen welchen ich gewählt habe. Wenn lust besteht und ihr noch andere Vorschläge habt, könnt ihr mir diese gerne noch mitteilen :)

Gruß und Danke

J.S

0