Comment puis-je utiliser le compteur de mots ( wc
) et la tuyauterie pour compter le nombre de fichiers ou de répertoires dans le /usr/bin
répertoire?
scripting
find
wc
file-types
en espèces
la source
la source
Réponses:
Une approche consisterait à utiliser
ls
pour nous donner une liste des fichiers, mais nous voulons que cette liste soit garantie de ne montrer qu'un seul fichier ou répertoire par ligne. L'-1
interrupteur fera cela pour nous.Exemple
Créez les exemples de données ci-dessus dans un répertoire vide.
Vérifie ça:
Maintenant, pour compter, vous pouvez utiliser
wc -l
pour compter le nombre de lignes, qui correspondent à un fichier ou un répertoire dans lals -1
sortie.(notez cependant qu'il n'inclut pas les fichiers cachés)
Compter des fichiers ou des répertoires, mais pas ensemble
Pour compter les fichiers ou les répertoires, vous devez modifier légèrement votre tactique. Dans ce cas, j'utiliserais
ls -l
car il montre ce qu'est un répertoire et ce qu'est un fichier.Exemple
Ensuite, nous pouvons utiliser
grep
pour filtrer les répertoires ou non-répertoires comme ceci:Maintenant, utilisez à
wc -l
nouveau pour compter ce qui précède:Cependant, vous pouvez éviter
wc
complètement et utilisergrep
l'-c
option de:(encore une fois, les fichiers cachés ne sont pas inclus. Notez que les répertoires et regular sont deux types de fichiers. Il y en a beaucoup plus comme des canaux nommés, des liens symboliques, des périphériques, des sockets ...).
Récursivité
Si vous devez trouver les fichiers et les répertoires de manière récursive sous,
/usr/bin
vous voudrez probablement changer complètement de tactique et utiliser un autre outil appeléfind
.Exemple
(même si au
/usr/bin
- dessus de lui - même est inclus dans le décompte)Les mêmes techniques que j'ai utilisées ci-dessus pourraient être utilisées
ls
pour faire quelque chose de similaire, mais cels
n'est généralement pas un bon outil pour analyser la sortie.find
d'autre part, a été conçu pour cela et propose des commutateurs pour rechercher des fichiers ou des répertoires.(notez que cette fois,
find
inclut les fichiers cachés (sauf.
et..
)).nouvelles lignes?
Je n'ai jamais compris pourquoi un caractère de nouvelle ligne est un caractère légal à utiliser lors de la création de noms de fichiers ou de répertoires. Donc, les méthodes décrites ci-dessus les utilisent
wc
etls
ne les contesteraient pas, alors utilisez-les dans cet esprit.Exemple
Créez un répertoire et un nom de fichier avec des retours à la ligne.
ls
les montre correctement:Mais
wc
compte les répertoires et les fichiers qui contiennent des sauts de ligne comme 2 éléments, pas un.Une méthode pour contourner ce problème, si vous utilisez l'implémentation GNU de,
find
est d'utiliserfind
la capacité de pour imprimer quelque chose d'autre à la place de chaque fichier qu'il trouve, puis les compter à la place.Exemple
Ici , nous tout ce constat êtes la dans le répertoire courant (sauf
..
), et l' impression d' un point (.
) pour chacun, puis compter les points en utilisantwc
la capacité de » count octets au lieu de lignes,wc -c
.Références
la source
/usr/bin
soient tous bien formatés (et ne contiendront pas non plus d'espaces, donc techniquement vous pourriez même justeecho * | wc -w
), il convient de noter que tous ces éléments se briseront sur les noms de fichiers contenant des sauts de ligne.ls -l
ouls -1
va casser b / c on compte les lignes, pas les mots! Lefind
peut casser, mais encore une fois, nous comptons des lignes et non des mots.touch $'foo\nbar'
dans un répertoire vide suivi par l'une de vos commandes (disonsls -1 | wc -l
), vous rapporterez deux fichiers plutôt qu'un - car ce fichier est de deux lignes en ce quiwc
concerne. À moins dels
remplacer les nouvelles lignes par un autre personnage (je ne pense pas, mais encore une fois je ne suis pas en mesure de tester pour le moment).wc -c
un problème lors du comptage des périodes?Si vous voulez obtenir une ventilation du nombre de chaque type de fichier récursivement sous un certain répertoire, avec GNU
find
, vous pouvez faire:Sur
/usr/bin
mon système, cela donne:Le
/dev
:Pour les liens symboliques, si vous préférez les compter comme le type de fichier vers lequel ils pointent plutôt que
symbolic links
, vous pouvez le changer en:Ce qui donne maintenant pour mon
/usr/bin
:(un lien symbolique rompu est un lien symbolique vers un fichier dont
find
le type ne peut pas être déterminé soit parce que le fichier n'existe pas, soit dans un répertoire auquel vous n'avez pas accès ou qu'il y a une boucle dans la résolution du chemin du fichier Dans mon cas, ces 2 où les liens symboliques vers des fichiers qui ont maintenant disparu).Aucun de ceux-là ne compte
.
et..
. Si vous vouliez les inclure (pourquoi le feriez-vous?), Il n'y a pas d'autre moyenfind
que de supposer qu'ils sont là pour chaque répertoire et de les compter systématiquement:Ce qui donne alors sur mon
/usr/bin
:Si vous n'avez pas accès au GNU
find
, vous pouvez réécrire le premier comme:Maintenant, à proprement parler, nous ne comptons pas les fichiers mais les entrées de répertoire . Un répertoire comme
/usr/bin
généralement possède plusieurs entrées qui pointent vers le même fichier. Par exemple, ici, j'ai:Ce sont 3 entrées de répertoire (aka noms de fichiers aka liens durs) dans le même fichier (celui avec inode 672252. Pour compter les fichiers au lieu des entrées de répertoire et avec GNU
find
et GNUuniq
(ignorant.
et..
fichiers qui de toute façon sont des liens durs vers d' autres répertoires):Sur mon
/usr/bin
, cela donne:la source
Vous n'avez pas dit si vous voulez que tout le fichier se trouve sous / usr / bin récursivement ou juste sous le premier niveau. Aussi, comment allez-vous obtenir les mots que vous comptez? La manière habituelle de le découvrir est d'exécuter find dans wc. Comme ceci: trouver / usr / bin | wc -l Find répertorie tout ce qui s'y trouve, répertoires et fichiers. Wc -l comptera toutes les lignes dans la sortie de recherche. Est-ce un devoir de classe? Ce n'est pas grave si c'est le cas, mais je me demandais pourquoi vous aviez besoin de ces informations pour que je puisse adapter la réponse plus soigneusement. Veuillez me faire savoir si vous en avez besoin de plus. Costa
la source
En bash, sans outils externes.
En bash, sans outils externes et récursivité.
la source
.
ni les..
entrées. Vous voudrez peut-être lever l'ambiguïté du fichier par rapport au fichier normal.