2009-03-24 5 views
1

ich den Code ausführen, gibt mir die folgenden Beispieldatenkann nicht zum Filtern von Zeilen, die "Ist ein Verzeichnis" von SED/AWK

md5deep find * | awk '{ print $1 }' 

Eine Probe des Ausgangs

/Users/math/Documents/Articles/Number theory: Is a directory 
    258fe6853b1bfb2d07f512ff6bec52b1 
    /Users/math/Documents/Articles/Probability and statistics: Is a directory 
    4811bfb2ad04b9f4318049c01ebb52ef 
    8aae4ac3694658cf90005dbdea37b4d5 
    258fe6853b1bfb2d07f512ff6bec52b1 

I enthalten habe versucht, die Zeilen, die enthalten, zu filtern

md5deep find * | awk '{ print $1 }' | sed s/\/*//g 
ist ein Verzeichnis
von SED nicht erfolgreich

Die Beispielausgabe ist

/Users/math/Documents/Articles/Number theory: Is a directory 
/Users/math/Documents/Articles/Topology: Is a directory 
/Users/math/Documents/Articles/useful: Is a directory 

Wie ich jede Zeile herausfiltern kann, die „Ist ein Verzeichnis“ von SED/AWK enthält?

[Klärung] Ich möchte die Zeilen herausgefiltert werden, die enthalten ist ein Verzeichnis.

Antwort

2

Ich habe nicht das md5deep-Tool verwendet, aber ich glaube, diese Zeilen Fehlermeldungen sind; Sie würden statt standard error statt Standard out gehen, und so gehen sie direkt zu Ihrem Terminal anstatt durch die Leitung. Daher werden sie nicht von Ihrem sed-Befehl gefiltert. Sie könnten sie filtern, indem Sie Ihre Standardfehler und Standardausgabeströme verschmelzen, aber

Es sieht aus wie (ich bin mir nicht sicher, weil Sie die einfachen Anführungszeichen fehlen) Sie

md5deep `find *` 

zu nennen versuchen und zu finden ist Zurückgeben aller Dateien und Verzeichnisse.

Einige Hinweise auf das, was Sie tun möchten, könnten:

  • Es sieht aus wie md5deep -r für „rekursiv“ Option hat. So können Sie versuchen:

    md5deep -r * 
    

    anstelle des Befehls finden.

  • Wenn Sie einen find Befehl verwenden möchten, können Sie ihn auf Dateien beschränken, die -type f anstelle von Dateien und Verzeichnissen verwenden.Außerdem müssen Sie * nicht in einen find-Befehl eingeben (der find verwirren kann, wenn Dateien mit Namen vorhanden sind, die wie die Optionen aussehen, die find versteht); Passing in . wird rekursiv durch das aktuelle Verzeichnis suchen.

    find . -type f 
    
  • In sed wenn Sie Schrägstriche in Ihrem Muster verwenden, kann es einen Schmerz sein, sie mit \ korrekt zu zitieren. Sie können stattdessen ein anderes Zeichen zum Abgrenzen Ihres regulären Ausdrucks wählen. sed verwendet das erste Zeichen nach dem s-Befehl als Trennzeichen. Ihrem Muster fehlt auch eine .; in regulären Ausdrücken, um eine Instanz eines beliebigen Zeichens anzugeben, das Sie verwenden ., und um "Null oder mehr des vorhergehenden Ausdrucks" anzugeben, verwenden Sie *, also gibt .* "null oder mehr irgendeines Zeichens" an (dies ist anders als glob patterns, wobei * allein bedeutet "null oder mehr irgendeines Zeichens").

    sed "s|/.*||g" 
    
  • Wenn Sie wirklich in Ihrer Standardausgabe einschließlich Ihrem Standardfehlerstrom sein wollen, so wird es das Rohr passiert, dann können Sie laufen:

    md5deep `find *` 2>&1 | awk ... 
    
  • Wenn Sie nur wollen zu ignorieren stderr, können Sie das zu /dev/null, umleiten, die eine spezielle Datei, die einfach alles verwirft, die in es geht:

    md5deep `find *` 2>/dev/null | awk ... 
    

Zusammenfassend denke ich, der Befehl unten werden Sie mit Ihrem unmittelbares Problem helfen und die anderen oben aufgeführten Vorschläge können Ihnen helfen, wenn ich nicht under, was Sie suchen:

md5deep -r * | awk '{ print $1 }' 
+0

Der letzte Befehl läuft weiter - er endet nie. Es scheint, dass md5deep -r nicht funktioniert. –

+0

Sorry, es sieht so aus, als ob md5deep Filename Argumente benötigt; also md5deep -r * sollte funktionieren. Wenn keine Argumente angegeben werden, erwartet es eine Standardeingabe. –

+0

Ihr letzter Befehl funktioniert! --- Mein Fehler mit dem Befehl md5deep 'find *' war, dass ich nicht die intelligente von '. Der Befehl setzt den sterr und stout auf den gleichen Ausgang. Gibt es eine Möglichkeit, sterr zu ignorieren, abgesehen von der Speicherung von stout und sterr in separaten Dateien? –

1

Warum nicht stattdessen grep verwenden?

dh

md5deep find * | grep "Is a directory" | awk '{ print $1 }' 

Edit: Ich habe Ihre Frage neu lesen einfach, und wenn Sie die Linien entfernen möchten mit ein Verzeichnis ist, verwenden Sie die Option -v von grep, das heißt:

md5deep find * | grep -v "Is a directory" | awk '{ print $1 }' 
+0

Der letzte Befehl scheint zu funktionieren. Das erste Problem war, dass Stout und Sterr im selben Output waren. Ich musste den Befehl 1> hashes.txt an das Ende Ihres Befehls setzen. Es scheint, dass md5deep nicht wie erwartet funktioniert - ich bekomme nur Hashes von Dateien im aktuellen Verzeichnis, nicht in Unterverzeichnissen. –

+0

keine Notwendigkeit, Grep zu verwenden. >>> md5deep finde * | awk '/ Ist ein Verzeichnis/{print $ 1}' – ghostdog74

0

Ich bin nicht vertraut mit md5deep, aber diese kann tun etwas wie Sie zu tun tun.

find -type f -exec md5sum {} + 
2

speziell Zur Beantwortung der Klarstellung: Wie man Zeilen mit awk und sed ausfiltert:

awk '/Is a directory/ {next} {print}' 
sed 'g/Is a directory/d' 
+0

Der erste Befehl funktioniert. Der letzte jedoch nicht. Ich habe den Befehl auch ohne die Anführungszeichen ausprobiert, da ich das Gefühl habe, dass Sie diese Anführungszeichen nicht in Mac/Linux brauchen. –

+0

Ah, richtig. Ich dachte an den Befehl ex 'g/re/d'. Für sed wollen Sie: sed '/ ist ein dir/d' (ohne das 'g') Und ja, Sie brauchen die Anführungszeichen, um das sed-Skript als einzelnes Argument an den Befehl sed zu übergeben. –

Verwandte Themen