
Ich habe diesen Code hier gefundenhttps://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.htmldas gibt mir übersichtlich die Anzahl der Dateien in meinem Verzeichnis an.
ls -1 | wc -l
aber ich möchte nur wissen, wie viele dieser Dateinamen beispielsweise mit 2009 beginnen 20091210_005037.nc
.
Ich habe es versucht ls -1 | wc -l 2009*
, aber das listet langsam alle Dateien auf und scheint mir keine Nummer zu geben.
Antwort1
set -- 2009*
echo "$#"
Dadurch wird die Liste der Positionsparameter ( $1
, $2
, ... usw.) auf die Namen gesetzt, die mit übereinstimmen 2009*
. Die Länge dieser Liste beträgt $#
.
Das Problem bei besteht darin, dass Sie direkt auf die Dateien ls -1 | wc -l 2009*
ausführen , die mit übereinstimmen , und die Anzahl der Zeilen in jeder Datei zählen. In der Zwischenzeit versucht , in die Standardeingabe von zu schreiben , von der nicht gelesen wird, da ihr eine explizite Liste der zu bearbeitenden Dateien übergeben wurde.wc -l
2009*
ls -1
wc
wc
Möglicherweise wollten Sie verwenden ls -d 2009* | wc -l
. Dies hätte alle übereinstimmenden Namen aufgelistet 2009*
( ls
mit with -d
würden Sie den Inhalt von Verzeichnissen nicht auflisten) und die Anzahl der Zeilen in der Ausgabe gezählt. Beachten Sie, dass dies -1
nicht erforderlich ist, wenn Sie das Ergebnis ls
irgendwohin weiterleiten (es sei denn, ls
es handelt sich um einen Alias oder eine Shell-Funktion, die eine Spaltenausgabe erzwingt).
Beachten Sie auch, dass Sie dadurch diefalschzählen, ob ein beliebiger Dateiname eine neue Zeile enthält:
$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
5
$ ls -1 | wc -l
5
Jedoch:
$ set -- 2009*
$ echo "$#"
1
(beim Verwenden set
und Ausgeben $#
werden in den meisten Shells zusätzlich keine externen Befehle verwendet)
Verwenden find
zum rekursiven Zählen:
find . -type f -name '2009*' -exec echo . \; | wc -l
Hier geben wir für jeden gefundenen Pfadnamen im oder unter dem aktuellen Verzeichnis einen Punkt aus und zählen dann die Anzahl der Zeilen, die dadurch entstehen. Wir zählen nicht die Dateinamenzeichenfolgen selbst, sondern tun dies auf diese Weise, um zu vermeiden, dass zu viele Zeilen gezählt werden, wenn ein Dateiname Zeilenumbrüche enthält.
Mit find
können wir dieTypder Datei, die wir zählen. Oben testen wir explizit aufreguläre Dateienmit -type f
(also nicht Verzeichnisse und andere Dateitypen). Das *
Muster in der Shell unterscheidet nicht zwischen Verzeichnissen und Dateien, aber die zsh
Shell kann *(.)
das Verhalten des Musters so ändern, dass nur normale Dateien übereinstimmen (der Benutzer würde wahrscheinlich anstelle von in den nicht- Varianten oben und unten zsh
verwenden ).2009*(.)
2009*
find
Verwenden Sie **
in (mit shopt -s globstar
in bash
oder set -o extended-glob
in yash
oder in jeder anderen Shell, die dies unterstützt), um rekursiv zu zählen:
set -- **/2009*
echo "$#"
Das Muster **
stimmt fast wie überein , stimmt aber auch in Pfadnamen *
überein ./
Antwort2
Habe es mit dem folgenden Befehl versucht und es hat gut funktioniert und das Ergebnis geliefert
find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'
Hinweis: Wenn Sie auch im Unterverzeichnis möchten, entfernen Sie bitte die Option maxdepth
Antwort3
Dank der Leute in den Kommentaren ist dies die Antwort auf meine Frage:
ls 2009* | wc -l
oder mit find
find 2009* | wc -l
Antwort4
So zählen Sie mit awk die Anzahl der Dateien, die mit einem bestimmten Dateinamen beginnen.
root@ubuntu$ find . -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is " ,total}'
total files starting with 2009 is 4