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

...komplette Frage anzeigen

5 Antworten

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!

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

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
@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
@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

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

Mit der Bash:

#!/bin/bash

fileName="test.txt"

if [ -e $fileName ] && [ ! -s $fileName ]; then
    cp ${fileName}_old $fileName
fi

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

Was möchtest Du wissen?