grep erzeugt nicht die richtige Ausgabe, wenn es mit dem Find-Befehl ausgeführt wird

grep erzeugt nicht die richtige Ausgabe, wenn es mit dem Find-Befehl ausgeführt wird

Meine Aufgabe bestand darin, die Anzahl der Dateien im aktuellen Verzeichnis auszudrucken, ohne Befehle lszu verwenden wc.

Ich hatte folgende Zeilen in das Skript eingetippt:

#!/bin/bash
find . -maxdepth 1 -type f \( ! -iname ".*" \) > list3
grep .* -c list3 > /dev/tty

Die Ausgabe ist:

..:0
.6.1c.sh.swp:1
list3:22

während es nach meinem Verständnis nur heißen müsste:22

Warum funktioniert das nicht?

Antwort1

Warum grepfunktioniert es nicht richtig

Das funktioniert nicht, weil Sie wissen müssen, grepdass dies .*das tatsächliche Muster ist, nach dem Sie suchen.

grep '.*' -c list3

Wenn Sie die einfachen Anführungszeichen nicht verwenden, wird Ihre Shell .*die Namen aller Dateien in Ihrem Verzeichnis erweitern. Dies nennt manDateinamenerweiterunga.txt b.txtSo grepsehen Sie beispielsweise :

grep a.txt b.txt -c list3

SeitEinzelzitateUm eine Ausweitung zu verhindern, ist dies hier der richtige Weg.


Wo Ihr grepBefehl falsch ist:

Übrigens gehen Sie mit dem Muster hier in die falsche Richtung. Der Punkt .in einem regulären Ausdruck entsprichtbeliebigZeichen und nicht der wörtliche Punkt. Siehedie manSeitefür weitere Informationen. Ihr regulärer Ausdruck lautet also derzeit: „Suche nach einem beliebigen Zeichen und dann nach einer Folge beliebiger Zeichen.“ Ziemlich überflüssig.

Wenn Sie tatsächlich eine Übereinstimmung meinen:

[Punkt] [irgendetwas anderes]

… müssen Sie den Punkt escapen:

\.*

Wo Ihre findBeherrschung verbessert werden könnte:

Ich weiß nicht, was du damit meinst, loswerden

\( ! -iname ".*" \)

Ihr findBefehl wird jeder Datei den Punkt für das aktuelle Arbeitsverzeichnis voranstellen, Sie entfernen hier also nichts. Sie hätten einfach Folgendes ausführen können:

find . -maxdepth 1 -type f

Antwort2

Um das ursprüngliche Problem zu beheben, zählen Sie Dateien ohne lsund wc:

Reine Shell-Syntax:

files=0
for i in *; do
    [ -f "${i}" ] && files=$((files+1))
done
echo ${files}

Um versteckte Dateien zur Zählung hinzuzufügen, ändern Sie einfach die Globbing-Einstellungen vor der forSchleife.

Alternativ: Spaß mit findeiner Shell-Erweiterung:

echo $(($(find -maxdepth 1 -type f -printf '+1')))

verwandte Informationen