awk in bash script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
wenis
Beiträge: 5
Registriert: 18.01.2012 16:54:52

awk in bash script

Beitrag von wenis » 18.01.2012 17:24:33

Hallo in die Runde,

ich habe ein Skript gefunden mit dem man doppelte Dateien finden und löschen kann, leider kann ich es nicht ganz nachvollziehen und hoffe hier kann mir einer sagen wie es funktioniert.

das skript:

Code: Alles auswählen

#! /bin/bash

find . -type f | while read ff
do
        base=$(basename "$ff")
        mod=$(stat -c %y "$ff")
       echo "$base;$mod;$ff"
done  | sort | awk -F ';' ' BEGIN { FIL=""; }
{ 
          if ( $1 == FIL )  {
                  print "+++ das ist doppelt: " $3
                  next;
          }
          FIL=$1;
}'
Ich habe das Skript getestet und es zeigt auch gut die doppelten Dateien an, nur verstehe ich nicht wie der awk Teil funktioniert. Nachdem der Dateiname und das Änderungsdatum in die Variablen gespeichert wurde wird alles mit sort sortiert und dann irgendwie an den awk Teil weitergeleitet. FIL wird leer gemacht und in der if bedingung danach wird der dateiname aus $1 mit FIL verglichen was ja leer ist und dann kommt die ausgabe der doppelten Datei. Kann mir einer sagen wo der eigentliche Vergleich von den dateinamen stattfindet? Da FIL ja ="" ist kann ich nicht nachvollziehen wie ein vergleich mit "nichts" ein Duplikat erkennt kann. und danach wird FIL der dateiname zugewiesen und in nächsten durchlauf wieder leer gemacht? Wäre schön wenn mich einer aufklären könnte :-D.

Benutzeravatar
shoening
Beiträge: 914
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: awk in bash script

Beitrag von shoening » 18.01.2012 18:03:26

Hi,

das FIL=""; steht im BEGIN block. D.h. es wird in der Initialisierungsphase des Scripts aufgerufen. Der Anschliessende Block merkt sich am ende dann immer die 1. Spalte, so dass er diesen mit dem entsprechenden Wert der naechsten Zeile vergleichen kann.

Klar?

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk in bash script

Beitrag von Meillo » 18.01.2012 18:59:54

wenis hat geschrieben:Hallo in die Runde,
Hallo und Willkommen im Forum. :-)

Code: Alles auswählen

#! /bin/bash

find . -type f | while read ff
do
        base=$(basename "$ff")
        mod=$(stat -c %y "$ff")
       echo "$base;$mod;$ff"
done  | sort | awk -F ';' ' BEGIN { FIL=""; }
{ 
          if ( $1 == FIL )  {
                  print "+++ das ist doppelt: " $3
                  next;
          }
          FIL=$1;
}'
Ich habe das Skript getestet und es zeigt auch gut die doppelten Dateien an,
Naja, gut scheint es mir nicht zu funktionieren. Es kann zwei Dateien als doppelt listen, die zwar gleich heissen, aber unterschiedlich gross sind. Zudem wird ja gar nicht anhand der Zeit verglichen. Es wird zwar nach ihr sortiert, aber das reicht noch nicht.

Ein besseres Programm ist Debianfdupes.


Unabhaengig davon zu deiner Frage:
Nachdem der Dateiname und das Änderungsdatum in die Variablen gespeichert wurde wird alles mit sort sortiert und dann irgendwie an den awk Teil weitergeleitet.
Korrekt. Das ``irgendwie'' ist eine Pipe.
FIL wird leer gemacht
Wie shoening geschrieben hat, ist das im BEGIN-Block, wird also nur einmal beim Programmstart ausgefuehrt. Zudem ist es unnoetig, da bei awk alle Variablen automatisch mit Null bzw. dem Leerstring initialisiert sind.

Ich denke mit dem Hinweis auf die Semantik des BEGIN-Blocks ist es klar geworden.
Use ed once in a while!

wenis
Beiträge: 5
Registriert: 18.01.2012 16:54:52

Re: awk in bash script

Beitrag von wenis » 26.01.2012 12:21:23

Danke für eure Erklärungen, jetzt habe ich es verstanden :idea: . Fdupes habe ich auch mal getestet und es funktioniert gut :THX:

Antworten