Meine Aufgabe bestand darin, die Anzahl der Dateien im aktuellen Verzeichnis auszudrucken, ohne Befehle ls
zu 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 grep
funktioniert es nicht richtig
Das funktioniert nicht, weil Sie wissen müssen, grep
dass 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.txt
So grep
sehen Sie beispielsweise :
grep a.txt b.txt -c list3
SeitEinzelzitateUm eine Ausweitung zu verhindern, ist dies hier der richtige Weg.
Wo Ihr grep
Befehl 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 man
Seitefü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 find
Beherrschung verbessert werden könnte:
Ich weiß nicht, was du damit meinst, loswerden
\( ! -iname ".*" \)
Ihr find
Befehl 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 ls
und 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 for
Schleife.
Alternativ: Spaß mit find
einer Shell-Erweiterung:
echo $(($(find -maxdepth 1 -type f -printf '+1')))