2016-07-28 17 views
-4

Wie kann ich diese Datei gzip? Ich erhalte eine Fehlermeldung:Wie gzip eine Datei

find /users/tnea01/logfile10.log -type f -exec sh -c \ 'gunzip /users/tnea01/logfile_archive/$(basename $0)_$(date -r {} +%F).gz $0' {} \; 

Hier ist der Fehler, den ich bekommen:

gzip: /users/tnea01/logfile10.tar.gz: No such file or directory gzip: /users/tnea01/logfile10.log: unknown suffix -- ignored

+2

Welchen Fehler bekommen Sie? – DaBler

+0

Finden Sie Befehlsarbeit ohne den Befehl exec? –

+0

Hier ist der Fehler, den ich bekomme: gzip: /users/tnea01/logfile10.tar.gz: Keine solche Datei oder Verzeichnis gzip: /users/tnea01/logfile10.log: unbekannt Suffix - ignoriert – connollyc4

Antwort

1

Wenn Sie nicht den genauen Dateinamen kennen, können Sie etwas tun könnten:

find /users/tnea01 -maxdepth 1 -name '*.log' -type f -exec sh -c \ 
    'for f; do 
     gzip -c <"$f" >"https://stackoverflow.com/users/tnea01/logfile_archive/${f##*/}_$(date -r "$f" +%F).gz" 
    done' _ {} + 

Um die beweglichen Teile zu erklären:

  • Die einzige sichere Möglichkeit, sh -c zu verwenden, ist mit einer vollständig konstanten Zeichenfolge; Ersetzen von Variablen (einschließlich Dateinamen) erzeugt Sicherheitslücken. Daher verwenden wir im Code keine Ersetzungsfunktion, sondern übergeben den Dateinamen als zusätzliches Argument.
  • for f; do ist das gleiche wie for f in "[email protected]"; do - es iteriert über alle Befehlszeilenargumente.
  • ${f**#/} wertet alles nach dem letzten / in $f; siehe the bash-hackers page on parameter expansion.
  • Erweiterungen, einschließlich $(date ...), müssen innerhalb eines doppelt zitierten Kontexts sein, um sicher zu sein; Hier setzen wir den gesamten Zieldateinamen in Anführungszeichen.

Da aber Sie tun, ist das alles völlig unnötig.

f=/users/tnea01/logfile10.log 
d=/users/tnea01/logfile_archive 
gzip -c <"$f" >"$d/${f##*/}_$(date -r "$f" +%F).gz" 
+0

Danke Charles Duffy! Es gibt tatsächlich 2 Dateien, die gesichert werden müssen, also habe ich deinen ersten Vorschlag verwendet, der perfekt funktioniert hat. Ich habe noch eine Frage, die keine große Sache ist, wenn sie zu viel Arbeit erfordert. Meine aktuelle Protokolldatei heißt logfile.log.10, die dann abrollt und gelöscht wird. ist es möglich, es so zu ändern, dass es nur logfile.log + last modified date.gz sagt? Grundlegend den aktuellen Protokolldateinamen minus dem .10 am Ende zu verwenden. Danke nochmal!!! – connollyc4

+0

@ connollyc4, mit "last modified date" meinst du zu sehen, welche logfiles im Verzeichnis existieren, die aktuellste zu finden und auf diese zu erweitern? Sie möchten BashFAQ # 3 folgen, um diese Datei zu identifizieren. siehe http://mywiki.wooledge.org/BashFAQ/003 –

+0

Entschuldigung, ich denke, ich habe das nicht richtig erklärt. Die Protokolldatei heißt "logfile.log.10", ich möchte das gleiche Skript wie den ersten Vorschlag mit dem Befehl find verwenden, aber benenne es in logfile.log + das Datum und die Uhrzeit um, wie es bereits mit dem Datum -r "$ f "+% ​​F).gz " – connollyc4