J'ai un répertoire avec un grand nombre de fichiers. Je ne vois pas de ls
commutateur pour fournir le compte. Existe-t-il une magie en ligne de commande pour obtenir un nombre de fichiers?
command-line
Blake
la source
la source
tree . | tail
outree -a . | tail
d'inclure des fichiers / répertoires cachés,tree
est récursif si c'est ce que vous voulez.Réponses:
Utilisation d'une définition large de "fichier"
(notez qu'il ne compte pas les fichiers cachés et suppose que les noms de fichiers ne contiennent pas de caractères de nouvelle ligne).
Pour inclure les fichiers cachés (à l'exception de
.
et..
) et éviter les problèmes de caractères de nouvelle ligne, procédez comme suit:Ou récursivement:
la source
wc
est un programme "compte de mots". Le-l
commutateur le fait compter les lignes. Dans ce cas, il compte les lignes dans la sortie dels
. C’est toujours ainsi que j’ai appris à obtenir un nombre de fichiers pour un répertoire donné.ls
faitls -1
si la sortie est un tuyau.ls -la
, vous obtiendrez trois lignes dans le répertoire. Vous voulezls -lA | wc -l
ignorer les entrées.
et..
. Cependant, vous serez quand même un par un.ls -q | wc -l
- notez que les fichiers cachés ne seront toujours pas comptés par cette approche et que les répertoires seront comptés.Pour une définition étroite du fichier:
la source
-maxdepth 1
comptage récursif des fichiers (ou l'ajuster à la profondeur de recherche maximale souhaitée).find -maxdepth 1 -type f -printf "\n" | wc -l
...
...
PS: note ls - <numéro un> | wc - <lettre-l>
la source
ls
do-1
le font automatiquement lorsque la sortie est dirigée vers un canal.[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
La réponse la plus complète en utilisant
ls
/wc
pair est probablementsi vous voulez compter les fichiers de points, et
autrement.
-A
est de compter les fichiers de points, mais omettre.
et..
.-q
makels
remplace les caractères non graphiques, en particulier le caractère de nouvelle ligne, avec?
, créant une ligne de sortie pour chaque fichierPour obtenir une sortie sur une ligne du
ls
terminal in (c.-à-d. Sans le canaliser danswc
), une-1
option doit être ajoutée.(comportement de
ls
testé avec coreutils 8.23)la source
-1
n'est pas nécessaire. Quant à "il gère les nouvelles lignes dans les noms de fichiers de manière sensible avec la sortie de la console" , cela est dû au-q
commutateur (que vous devriez utiliser à la place,-b
car il est portable) qui "Force chaque instance de caractères de nom de fichier non imprimables et de caractères <tab> à être écrits en tant que caractère <point-marque> ('?'). Les implémentations peuvent fournir cette option par défaut si la sortie est destinée à un terminal. " Donc, par exemple,ls -Aq | wc -l
compter tous les fichiers / répertoires ouls -qp | grep -c /
uniquement les répertoires non masqués, etc.-b
pour-q
.Si vous savez que le répertoire en cours contient au moins un fichier non caché:
Ceci est évidemment généralisable à n'importe quel glob.
Dans un script, cela a pour effet parfois regrettable de remplacer les paramètres de position. Vous pouvez contourner ce problème en utilisant un sous-shell ou une fonction (version Bourne / POSIX) telle que:
Une solution alternative est
$(ls -d -- * | wc -l)
. Si le glob est*
, la commande peut être raccourcie à$(ls | wc -l)
. L'analyse de la sortie dels
me met toujours mal à l'aise, mais ici, cela devrait fonctionner tant que vos noms de fichiers ne contiennent pas de nouvelles lignes, ou que vous lesls
échappiez. Et$(ls -d -- * 2>/dev/null | wc -l)
a l'avantage de gérer le cas d'un glob ne correspondant pas (c'est-à-dire qu'il renvoie 0 dans ce cas, alors que laset *
méthode nécessite un test fastidieux si le glob peut être vide).Si les noms de fichier peuvent contenir des caractères de nouvelle ligne, une autre solution consiste à utiliser
$(ls -d ./* | grep -c /)
.Chacune de ces solutions reposant sur le transfert de l'extension d'un glob à
ls
peut échouer avec une erreur de liste d'arguments trop longue s'il y a beaucoup de fichiers correspondants.la source
local
ou l'éliminer:eval $1=$#
ou simplement utiliserecho $#
et fairenumber_of_files=$(count_words *)
.$#
(vous ne l'aviez pas fait avant le montage)?$1
. Donc, ce que je veux compter, c'est le nombre de paramètres qui ne sont pas le premier paramètre. (Je ne peux pas utilisershift
parce que je dois garder le nom de la variable.) (Euh, si vous aviez posé des questions sur la première ligne ...)shift
si je le fais bien.J'ai trouvé
du --inodes
utile, mais je ne sais pas quelle version endu
a besoin. Il devrait être considérablement plus rapide que les approches alternatives utilisantfind
etwc
.Sur Ubuntu 17.10, les travaux suivants:
Combinez avec
| sort -nr
pour trier par ordre décroissant le nombre d'inodes contenus.la source
En utilisant la paire ls / wc si nous ajoutons -U, cela sera beaucoup plus rapide (ne pas trier).
la source
-U
est spécifique à GNU cependant.Après avoir installé la commande tree, tapez simplement:
tree
Si vous voulez aussi des fichiers cachés:
tree -a
Si vous utilisez Debian / Mint / Ubuntu Linux, tapez la commande suivante pour installer la commande tree:
sudo apt-get install tree
L'option -L est utilisée pour spécifier le niveau d'affichage maximal de l'arborescence. La commande tree ne compte pas seulement le nombre de fichiers, mais également le nombre de répertoires, en prenant en compte autant de niveaux de l'arborescence que vous le souhaitez.
la source
-maxdepth 1
le rendra non-récursif,find
est récursif par défaut-type f
inclura les fichiers uniquement-printf .
est une touche mignonne. il imprime un point pour chaque fichier au lieu du nom de fichier, et est maintenant capable de gérer n'importe quel nom de fichier et enregistre également les données; il suffit de compter les points :)| wc -c
compte les personnagesla source
Pas de tuyau, pas de copie de chaîne, pas de fourche, juste un liner
la source
Voici une autre technique dans le sens de celle que Gilles a postée :
qui crée un tableau avec 13 923 éléments (si c'est le nombre de fichiers).
la source
c
tableau?word_count() { echo "$#"; }
serait suffisant. Le but de la solution @Gilles est de stocker le compte dans une variable renvoyée pour éviter de devoir utiliser la substitution de commande (qui implique un fork et un pipe dans des shells autres que ksh93).Cela ne peut lister que les fichiers du répertoire courant.
la source
find . -type f
trouvera des fichiers dans le répertoire en cours, et aussi, de manière récursive, dans des sous-répertoires.Essayez ceci j'espère que cette réponse vous aidera
la source
Vous pouvez vérifier avec:
la source
Améliorer certaines réponses données auparavant mais cette fois-ci explicitement.
Il est digne de noter l'utilisation de commandes aimées comme
tail
etcut
. Notez également que l’arborescence n’est pas disponible par défaut. La commande ci-dessus commence par capturer des informations sur le répertoire au niveau 1, puis affiche la dernière lignetail -n 1
où se trouve notre objectif et finit parcut
prendre le troisième mot.Par exemple, localiser dans
/
:Alors, pourquoi ne pas demander le nombre de répertoires?
la source
Sous Linux, pour rendre la commande très robuste et gérer les fichiers dont le nom peut contenir une nouvelle ligne, utilisez ceci:
Cela nous évite l' épreuve de l'analyse de la
ls
sortie.Apparenté, relié, connexe:
la source
Utilisez la
tree
commande, juste:la source