Einfache Frage, aber ich bin nicht sicher, wo ich suchen soll, und Google reagiert nicht auf Punkte und Schrägstriche.
Ich habe nur versucht, die Anzahl der Dateien und Verzeichnisse im aktuellen Verzeichnis zu zählen (ohne Unterordner / Dateien) und habe versucht, zu unterscheiden, ls -1 | wc -l
und ls | wc -l
da sie identisch zu sein scheinen. Eine Site, die ich mir ansah, sagte: "Denken Sie daran, dass dies auch die Verzeichnisse ./ und ../ zählt." in Bezug auf die mit ls -1
, und ich bin nicht sicher, ob das bedeutet, dass es die Verzeichnisse vor oder etwas enthält (was ich nicht möchte), aber es schien nicht zu tun, dass aus dem Testen.
Könnte jemand bestätigen, welches der Verzeichnisse am besten geeignet ist, um die Anzahl der Dateien und Verzeichnisse im aktuellen Verzeichnis (nicht im Unterverzeichnis) zu zählen, und was sie mit ./ und ../ Verzeichnissen bedeuten?
Antworten:
Jedes Verzeichnis auf einem Unix-System (und wahrscheinlich auch jedes andere System) enthält mindestens zwei Verzeichniseinträge. Dies sind
.
(aktuelles Verzeichnis) und..
(übergeordnetes Verzeichnis). Im Fall des Stammverzeichnisses verweisen diese auf dieselbe Stelle, bei allen anderen Verzeichnissen sind sie jedoch unterschiedlich. Sie können dies mit den Befehlenstat
,pwd
undcd
(unter Linux) überprüfen:Beachten Sie, dass
bin
undsbin
jeder hat zwei Links dazu. Einer ist der Verzeichniseintrag im Stammverzeichnis und der andere ist der.
Eintrag in diesem Verzeichnis.Die Verwendung
ls
mit einer Pipe towc -l
ist ein einfacher Trick, um die Anzahl der Zeilen in der Ausgabe von ls zu zählen. Die Annahme ist, dass jede Datei oder jedes Verzeichnis genau eine Zeile in der Ausgabe belegt. GNU ls wird dies automatisch tun, wenn der Ausgang kein Terminal ist. Andere benötigen möglicherweise die-1
Option, um das Verhalten explizit zu aktivieren.wc -l
Zählt einfach die Anzahl der Zeilen (-l
) in seiner Eingabe und gibt sie aus .Das Problem bei diesem Ansatz ist, dass in Linux und in den traditionell unter Linux verwendeten Dateisystemen Datei- und Verzeichnisnamen (in dieser Hinsicht sind sie wirklich identisch) Zeilenumbrüche enthalten dürfen . Bei Vorhandensein dieser Einträge fällt jede Methode auseinander - diese Einträge werden als zwei oder mehr Einträge gezählt, wenn sie in Wirklichkeit eins sind.
Solange Sie GNU ls verwenden, haben keine Verzeichniseinträge mit Namen Zeilenumbrüche enthalten, und haben keine ungeradeen Aliase für
ls
(zum Beispiells -a
), werden beide Ausgänge die Anzahl der Dateien und Verzeichnisse im aktuellen (oder angegebenen) Verzeichnis. Für die meisten Menschen ist das gut genug, aber im allgemeinen Fall nicht gültig .Wenn Sie ungewöhnliche Zeichen (hauptsächlich Zeilenumbrüche) in Verzeichniseintragsnamen richtig behandeln müssen, schlage ich vor, die
-b
Option ls zu verwenden , um sie zu maskieren .ls -1bA
Gibt den Namen jedes Verzeichniseintrags in einer eigenen Zeile aus, wobei ungewöhnliche Zeichen (dh jeder Verzeichniseintrag wird als ein einziger angezeigt), einschließlich aller Punktdateien und -verzeichnisse, ausgeblendet werden. Wenden Sie sich an,wc -l
um eine vollständige Befehlszeile zu erhalten,ls -1bA | wc -l
die die Anzahl der Dateien und Verzeichnisse im aktuellen Verzeichnis angibt (aber ignorieren Sie.
und..
; das ist der Unterschied zwischen-a
und-A
), aber nicht in Unterverzeichnisse absteigend. Wenn Sie nicht möchten, dass Dotfiles zur Gesamtsumme gezählt werden, lassen Sie den-A
Parameter einfach wegls
.quelle
-a
und-A
auch versteckte Dateien, von denen ich erkannt habe, dass ich sie vermeiden möchte. Das würde ich höchstens tunls -b | wc -l
, aber das gibt mir die richtige Antwort. Ist die Zeile, die ich in Bezug auf diesen Befehl kopiere und einfüge, falsch? Wenn es richtig war, sollte ich dann nicht eine Ausgabe von 8 erhalten, wenn sich 6 Dateien oder Ordner in einem Verzeichnis befinden?mkdir()
Systemaufruf gab. Nicht alle Dateisysteme haben sie und sie werden von POSIX nicht einmal benötigt oder benötigt.So beantworten Sie die Frage im Betreff:
Wenn ein Verzeichnis B in Unix erstellt wird, wird er als neuer Eintrag in ein anderes Verzeichnis A (das übergeordnete Verzeichnis) und in B hinzugefügt werden zwei Einträge hinzugefügt: one bezeichnet
.
als feste Verbindung zu sich selbst, und man bezeichnet..
als Fest Link zu A.Dies sind die einzigen festen Links zu Verzeichnissen, die zulässig sind (obwohl einige ältere Versionen einiger Unices auch beliebige Links zuließen).
Aus diesem Grund gibt bei den meisten Dateisystemen (
btrfs
eine bemerkenswerte Ausnahme) die Nummerlinks
eines Verzeichnisses an, über wie viele Unterverzeichnisse es verfügt (wobei deren..
Einträge berücksichtigt werden ).Wenn Sie ein Verzeichnis umbenennen / verschieben und es sich in demselben Verzeichnis befindet (unter einem anderen Namen), wird nur der Namenseintrag in
A
geändert. B.
und..
ist nicht betroffen. Aber wenn Sie sich bewegen es tun ein anderes Verzeichnis, dann..
inB
wird sich ändern. Das erklärt, warum Sie ein Verzeichnis, auf das Sie keinen Schreibzugriff haben (vorausgesetzt, Sie haben Schreibzugriff auf das übergeordnete Verzeichnis), nur umbenennen können, solange Sie es nicht in ein anderes Verzeichnis verschieben (andernfalls verhindert die Notwendigkeit, den..
Eintrag zu ändern) Sie davon ab, es zu bewegen).Beachten Sie jedoch:
/a/b/../c
vielleicht nicht das gleiche wie sein ,/a/c
da/a/b
könnte eine sein symbolischer Link zu einem anderen Verzeichnis.Eine Ausnahme ist, wenn dieser Pfad dem
cd
Befehl für einige Shells zugewiesen wird. Diesecd
behandeln es..
logisch , die..
Einträge in Verzeichnissen zu ignorieren . Ein Grund, warum Siecd -P
in ordnungsgemäß geschriebenen Skripten häufig feststellen, dass diese Funktion deaktiviert werden muss, da dies sonst zu Verwirrung und Inkonsistenzen führen kann.Um die Anzahl der Einträge im aktuellen Verzeichnis ohne
.
und..
mit zu zählenbash
, können Sie Folgendes tun:Mit zsh:
Tragbar:
quelle
ls | wc -l
ist der einzige Ausnahme.
und..
ls
listet keine versteckten Dateien auf. Sie müssenls -A
das gleiche wie diese bekommen. WENN Sie die versteckten Dateien nicht zählen möchten, entfernen Sie dasdotglob
(für Bash) oderD
(für Zsh) oder fügen Sie ein! -name '.*'
Vorher-print
für hinzufind
.ls | wc -l
ich immer noch die richtige Antwort gebe und versteckte Dateien ausschließt,.
&..
?.
,..
und eine andere Datei , deren Name beginnt mit.
dem nicht durch ls aufgeführt , aber wäre durchls -A
. Sols | wc -l
erhalten Sie nicht die richtige Antwort , weil es nicht , dass die versteckte Datei zu zählen..
und..
sind versteckte Dateien, da sie mit einem beginnen.
. Es gibt sogar eine Legende, die erklärt, dass Punktedateien versehentlich ausgeblendet werden, da eine frühe Implementierung vonls
nur.
und ausschließen sollte..
, aber es gab einen Fehler, der dazu führte, dass alle Dateien, die mit beginnen, ausgeschlossen wurden.
.ls | wc -l
funktioniert nicht, wenn Dateinamen Zeilenumbrüche enthalten.Ich bin kein großer Linux-Experte, aber ich kenne Linux (war vor 16 Jahren Administrator bei Slackware :), gute alte Zeit
In den Verzeichnissen ./ und ../ ist es ganz einfach:. ist aktuelles Verzeichnis, .. ist vorheriges Verzeichnis (im Baum von pwd -local directory command-
Wenn es sie zählt, rechne ich damit, dass sie 2 zur Gesamtsumme der Auflistung addieren, nicht wirklich rekursiv gehen und das Verzeichnis unter dem aktuellen zählen und auch das aktuelle Verzeichnis (.) Noch einmal zählen :))
Grundsätzlich denke ich, dass es den Wert 2 hinzufügt, um bereits (Dateien) im aktuellen Verzeichnis zu zählen.
Wer korrigiert mich, wenn ich falsch liege?
Ich poste nur um zu helfen und sehe, dass niemand diese Frage hier beantwortet hat, sie könnten beschäftigt sein. Aber experimentieren Sie einfach und sehen Sie, ob Sie 10 Dateien haben und die Anzahl von 12 erhalten, dann ist es das.
quelle
ls | wc -1
ls | wc -l
umfasst.
und ,..
wenn ich die richtige Antwort, in Bezug auf die richtige Antwort im Gegensatz + 2.