Bash Script zum finden von bestimmten Datein

fstaske

Cadet 4th Year
Registriert
Dez. 2013
Beiträge
126
Hallo Zusammen,

also ich lege gleich mal los.

ich habe den ordner /xyz, in diesem befinden sich zu meist Dateien, die ein Paar sind, sprich haben den gleichen Namen, aber eine andere Dateiendung.
Das sieht so aus:
Code:
vzdump-qemu-118-2017_07_02-04_11_30.log
vzdump-qemu-118-2017_07_02-04_11_30.vma.lzo
vzdump-qemu-124-2017_01_04-15_05_00.log
vzdump-qemu-124-2017_01_04-15_05_00.vma.lzo
Ich möchte mit dem Script alle .log Dateien löschen, die keine passende .vma.lzo Datei haben.

Ich hoffe, ihr könnt mir hierbei behilflich sein.
 
Ganz prakmatisch:
Prüfe für jede Datei mit Endung ".log", ob es eine gleichnamige Datei mit Endung ".vma.lzo" gibt. Wenn nicht, lösche die Logdatei.

Mit den Bash-Konstrukten "for" und "if" solltest du da ein gutes Stück weiterkommen.
 
Code:
for FILE in $(ls | grep -ie "\.log$"); do
    [[ ! -f "${FILE}.vma.lzo" ]] && rm ${FILE}
#  [[ ! -e "${FILE}.vma.lzo ]] && rm ${FILE}
done
-e: Returns true value, if file exists
-f: Return true value, if file exists and regular file
-r: Return true value, if file exists and is readable
-w: Return true value, if file exists and is writable
-x: Return true value, if file exists and is executable
-d: Return true value, if exists and is a directory

keine Gewähr, da ohne Kaffee geschrieben.
 
Zuletzt bearbeitet:
@Twostone,
mit dem Script werden alle .log Dateien gelöscht.
 
fstaske schrieb:
@Twostone,
mit dem Script werden alle .log Dateien gelöscht.

Dann existiert zu jeder Log-Datei auch eine Datei gleichen Namens mit der Endung vma.lzo.

Zeile 1 listet (ls) Dir alle Dateien und gibt die Ausgabe an grep weiter, das Dir dann nach .log als Endung filtert (| grep -ie "\.log$").

Zeile 2 nimmt den Dateinamen und ueberprueft, ob eine Datei diesen Namens mit Endung .vma.lzo nicht vorhanden ist([[ ! -f "${FILE%.log}.vma.lzo" ]]). Wenn wahr (&&), dann wird diese Datei geloescht (rm ${FILE}). Die Angabe ${FILE%.log} kuerzt die Variable entsprechend dem Muster und gibt den Wert vor der ersten Uebereinstimmung aus..

Du kannst ja auch einen Test schreiben.

Code:
for FILE in $(ls | grep -ie "\.log$"); do
   [[ ! -f "${FILE%.log}.vma.lzo" ]] && echo "${FILE} hat eine .vma.lzo"
   [[ -f "${FILE%.log}.vma.lzo" ]] && echo "${FILE} hat KEINE .vma.lzo"
done

edit: Ok, Fehler gefunden. Aber den haettest Du auch finden koennen: die Dateien enden nicht auf .log.vma.lzo, ergo ist die Abfrage auf "nicht vorhanden" stets wahr. Ich hatte mir die Dateinamen nicht genau angeschaut.

Korrigiert ist's dann:
Code:
for FILE in $(ls | grep -ie "\.log$"); do
   [[ ! -f "${FILE%.log}.vma.lzo" ]] && rm ${FILE}
done
 
Zuletzt bearbeitet:
Twostone schrieb:
Korrigiert ist's dann:
Code:
for FILE in $(ls | grep -ie "\.log$"); do
   [[ ! -f "${FILE%.log}.vma.lzo" ]] && rm ${FILE}
done
An welcher Stelle muss ich den Pfad angeben, in dem die Dateien liegen?
 
Dieser kleine Fetzen ist so geschrieben, daß er direkt im betreffenden Verzeichnis ausgeführt werden sollte. Entweder packst Du das auf eine Zeile, ggf. als alias in die .bashrc oder eben als Funktionsbaustein in selbiger. Einen Pfad fest angeben, wozu.
 
Zurück
Oben