Wenn Datei leer (nicht NULL) dann Datei überschreiben?
Hallo
ich soll in der arbeit ein Script erstellen und ich weiß leider nicht genau die Befehle dazu.
Es soll folgendes geschehen:
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 ganze im Linux System
Bitte um schnelle Hilfe
Danke und Gruß
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
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
@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.txtLinuxhase
@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.
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
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!
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
da habe ich wohl zu schnell geschrieben. So muss die Zeile heißen. Das ! vor [file exists .. liefert "richtig" wenn die Datei nicht existiert