Zählen Sie die Anzahl der Dateien im Verzeichnis mit einem bestimmten Namen

Zählen Sie die Anzahl der Dateien im Verzeichnis mit einem bestimmten Namen

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 -l2009*ls -1wcwc

Möglicherweise wollten Sie verwenden ls -d 2009* | wc -l. Dies hätte alle übereinstimmenden Namen aufgelistet 2009*( lsmit with -dwürden Sie den Inhalt von Verzeichnissen nicht auflisten) und die Anzahl der Zeilen in der Ausgabe gezählt. Beachten Sie, dass dies -1nicht erforderlich ist, wenn Sie das Ergebnis lsirgendwohin weiterleiten (es sei denn, lses 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 setund Ausgeben $#werden in den meisten Shells zusätzlich keine externen Befehle verwendet)


Verwenden findzum 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 findkö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 zshShell 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 zshverwenden ).2009*(.)2009*find

Verwenden Sie **in (mit shopt -s globstarin bashoder set -o extended-globin yashoder 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

verwandte Informationen