Question simple, mais je ne sais pas où chercher et google ne répond pas aux règles et aux barres obliques.
J'essaie simplement de compter le nombre de fichiers et de répertoires dans le répertoire actuel (sans inclure les sous-dossiers / fichiers) et j'essayais de les différencier ls -1 | wc -l
et ls | wc -l
car ils semblent identiques. Un site que je consultais disait "Gardez à l'esprit que cela compte également les répertoires ./ et ../." en ce qui concerne celui avec ls -1
, et je ne sais pas si cela signifie qu'il inclut les répertoires avant ou quelque chose (ce que je ne veux pas), mais il ne semble pas que cela ait été fait à partir des tests.
Quelqu'un pourrait-il confirmer lequel serait le plus approprié pour compter le nombre de fichiers et de répertoires dans le répertoire en cours uniquement (pas de sous-répertoire) et ce qu'ils entendent par les répertoires ./ et ../?
Réponses:
Chaque répertoire sur un système Unix (et probablement tous les autres systèmes aussi) contient au moins deux entrées de répertoire. Ce sont
.
(répertoire courant) et..
(répertoire parent). Dans le cas du répertoire racine, ceux-ci pointent au même endroit, mais avec tout autre répertoire, ils sont différents. Vous pouvez le constater par vous-même en utilisant les commandesstat
,pwd
etcd
(sous Linux):Notez cela
bin
etsbin
chacun a deux liens. L'un est l'entrée de répertoire dans le répertoire racine et l'autre est l'.
entrée dans ce répertoire.L'utilisation
ls
avec un tube towc -l
est une astuce simple pour compter le nombre de lignes dans la sortie de ls. L'hypothèse est que chaque fichier ou répertoire occupera exactement une ligne dans la sortie. GNU ls le fera automatiquement lorsque la sortie est non terminale; d'autres peuvent avoir besoin de l'-1
option pour activer explicitement le comportement.wc -l
compte et affiche simplement le nombre de lignes (-l
) dans son entrée.Le problème avec cette approche est que sous Linux et sur les systèmes de fichiers traditionnellement utilisés sous Linux, les noms de fichiers et de répertoires (ils sont vraiment les mêmes à cet égard) sont autorisés à contenir des caractères de nouvelle ligne . En présence de ceux-ci, l'une ou l'autre méthode s'effondre - ces entrées seront comptées comme deux entrées ou plus alors qu'en réalité elles ne font qu'un.
Tant que vous utilisez GNU ls, n'avez aucune entrée de répertoire avec des noms contenant des caractères de nouvelle ligne, et n'avez pas d'alias impairs pour
ls
(par exemple,ls -a
), les deux afficheront le nombre de fichiers et de répertoires dans le répertoire actuel (ou spécifié). Pour la plupart des gens, c'est suffisant, mais ce n'est pas valable dans le cas général .Si vous devez gérer correctement les caractères inhabituels (principalement les sauts de ligne) dans les noms des entrées de répertoire, je suggère d'utiliser l'
-b
option ls pour les échapper.ls -1bA
imprimera chaque nom d'entrée de répertoire sur sa propre ligne, échappera les caractères inhabituels (de sorte que chaque entrée de répertoire sera considérée comme une seule), y compris les fichiers de points et les répertoires. Tack onwc -l
pour une ligne de commande complètels -1bA | wc -l
qui rapportera le nombre de fichiers et de répertoires dans le répertoire actuel (mais ignorez.
et..
; c'est la différence entre-a
et-A
), mais ne descendez dans aucun sous-répertoire. Si vous ne voulez pas que les fichiers dot soient comptés dans le total, omettez simplement le-A
paramètre àls
.la source
-a
et-A
incluent également les fichiers cachés que j'ai réalisé que je veux éviter, donc tout au plus je le feraisls -b | wc -l
, mais cela me donne la bonne réponse. La ligne copiée et collée concernant cette commande est-elle incorrecte? Si c'était correct, ne devrais-je pas obtenir une sortie de 8 alors qu'il y a 6 fichiers ou dossiers dans un répertoire?mkdir()
encore d'appel système. Tous les systèmes de fichiers ne les ont pas et ils ne sont même pas nécessaires ni requis par POSIX.Pour répondre à la question sur le sujet:
Lorsqu'un répertoire B est créé sous Unix, il est ajouté en tant que nouvelle entrée à un autre répertoire A (son répertoire parent) et en B, deux entrées sont ajoutées: une appelée en
.
tant que lien dur vers elle-même et une appelée en..
tant que disque dur. lien vers A.Ce sont les seuls liens durs vers les répertoires autorisés (bien que certaines anciennes versions de certains Unices autorisent également les liens arbitraires).
c'est pourquoi avec la plupart des systèmes de fichiers (
btrfs
étant une exception notable), le nombre d'links
un répertoire est une indication du nombre de sous-répertoires qu'il possède (en tenant compte de leurs..
entrées).Lorsque vous renommez / déplacez un répertoire, s'il s'agit du même répertoire (sous un nom différent), seule l'entrée de nom dans
A
est modifiée. B.
et..
n'est pas affecté. Mais si vous le déplacez faire un autre répertoire, puis..
enB
va changer. Cela explique pourquoi vous pouvez renommer un répertoire sur lequel vous n'avez pas accès en écriture (en supposant que vous avez un accès en écriture au répertoire parent) tant que vous ne le déplacez pas vers un autre répertoire (sinon la nécessité de modifier l'..
entrée empêche vous de le déplacer).Attention cependant:
/a/b/../c
peut ne pas être le même que/a/c
parce qu'il/a/b
peut s'agir d'un lien symbolique vers un autre répertoire.Une exception à cela est lorsque ce chemin est donné à la
cd
commande pour certains shells. Cescd
s traitent..
logiquement en ignorant les..
entrées dans les répertoires. Une raison pour laquelle vous voyez souventcd -P
dans des scripts correctement écrits, la désactivation de cette fonctionnalité qui pourrait autrement causer de la confusion et des incohérences.Pour compter le nombre d'entrées dans le répertoire courant hors
.
et..
avecbash
, vous pouvez:Avec zsh:
Portablement:
la source
ls | wc -l
soit le seul à exclure.
et..
ls
ne répertorie pas les fichiers cachés. Vous devezls -A
obtenir les mêmes que ceux-ci. SI vous ne voulez pas compter les fichiers cachés, décochezdotglob
(pour bash) ouD
(pour zsh) ou ajoutez un! -name '.*'
avant-print
pourfind
.ls | wc -l
me donne toujours la bonne réponse et exclut les fichiers cachés,.
&..
?.
,..
et un autre fichier dont le nom commence par.
qui n'est pas répertorié par ls mais serait parls -A
. Donc,ls | wc -l
ne vous donne pas la bonne réponse car il ne compte pas ce fichier caché..
et..
sont des fichiers cachés car ils commencent par un.
. Il y a même une légende qui explique que les fichiers dot sont cachés par accident car une implémentation précoce dels
était censée exclure uniquement.
et..
, mais il y avait un bogue qui l'a obligé à exclure tout fichier commençant par.
.ls | wc -l
ne fonctionne pas si les noms de fichiers contiennent des caractères de nouvelle ligne.Je ne suis pas un grand expert Linux, mais je connais Linux (anciennement administrateur il y a 16 ans, sur Slackware :) bon vieux temps
les répertoires ./ et ../ c'est simple:. est le répertoire courant, .. est le répertoire précédent (dans l'arborescence de pwd -local directory command-
Si cela les compte, je pense qu'ils ajoutent 2 au total de la liste, ne vont pas vraiment récursivement et comptent le répertoire en dessous de celui en cours, et comptent également à nouveau le répertoire actuel (.) :))
Donc, fondamentalement, je pense qu'il ajoute la valeur 2 à déjà compter (fichiers) dans le répertoire actuel.
Quiconque me corrige si je me trompe.
Je poste juste pour aider et vu que personne n'a répondu à cette question ici, ils pourraient être occupés. Mais expérimentez et voyez si vous avez 10 fichiers et obtenez le nombre de 12, alors c'est tout.
la source
ls | wc -1
ls | wc -l
inclut.
et..
quand j'obtiens la bonne réponse, par opposition à la bonne réponse + 2.