Je veux compter le nombre total de fichiers dans un répertoire particulier qui se termine par l'extension ".mp4".
J'obtiens la commande suivante:
ls -F |grep -v / | wc -l
Il compte tous les fichiers dans un répertoire particulier, mais je veux le nombre de fichiers se terminant par l'extension .mp4.
Existe-t-il une commande Ubuntu pour cela?
command-line
ls
Prakash V Holkar
la source
la source
ls -1
la gestion des caractères de nouvelle ligne rend, dans ce cas, raisonnable l'analyse de lals
sortie. Celui marqué est incorrect pour l'utilisation de l'indicateur -R.Réponses:
Ici, vous pouvez faire de cette façon
Cela vous donne le compte
la source
-R
? Pourquoi faire un pleinstat
quand vous avez juste besoin du nom de fichier? Pourquoi ne pasls -1 *.jpg| wc -l
? (ok, ne fonctionne pas si vous avez des noms de fichiers avec des retours à la ligne. Dans ce cas, vous le méritez ;-) ...).jpg
. L'avez-vous déjà testé?*.jpg
est développé par le shell, pas parls
) et s'il y a des fichiers dont les noms commencent par des tirets..
. Mais cela fonctionne bien avec les tirets dans les noms, sauf quand/path/to/dir
la chaîne vide ou un chemin relatif commençant par un trait d'union. Mais j'avais tort avant d'avoir dit quels
remplace les caractères par?
. Cela se produit lorsque stdout est un terminal, mais ici, la sortie est un canal, doncls
envoie tous les caractères des noms de fichiers verswc
. Cela rend cette réponse incorrecte sans l' indicateur-q
ou-b
pour modifier ce comportement , car les noms de fichiers peuvent contenir des sauts de ligne. La réponse de l0b0 est exempte de ces problèmes.Malheureusement, ce problème bénin est difficile à résoudre d'une manière qui prend en charge tous les noms de fichiers et est portable. C'est sûr (il gère les fichiers cachés, les chemins contenant des espaces, des tirets et même des nouvelles lignes)
et compatible POSIX:Si vous ne voulez pas que ce soit récursif, ajoutez simplement
-maxdepth 1
.Vous ne devez pas analyser la
ls
sortie.Tester:
Comparez avec la réponse acceptée :
Ou d'autres suggestions:
la source
-printf x
place de-exec printf x \;
. C'est-à-dire: ilfind /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
n'y a pas besoin de-exec
laprintf
commande externe , qui s'il y a beaucoup de fichiers sera très lente , carfind
elle doit fork (2) une copie d'elle-même et ensuite execve (2)/usr/bin/printf
. Avec-exec printf x \;
, cela doit être fait une fois pour chaque fichier .-printf
n'est pas pris en charge dans POSIXfind
, c'est pourquoi je ne l'ai pas utilisé.-mindepth
et-maxdepth
que vous avez utilisés.find
contient-mindepth
et-maxdepth
mais ne contient pas,-printf
donc j'apprécie l'inclusion des deux.Celui-ci recherche, trie et répertorie tous les fichiers par extension dans l'ordre:
la source
| sort -rn
à la fin et peut-être un-mindepth 1
dir si juste actuel.head -n
obtenir le top n.Je pense que c'est très simple en suivant les commandes.
ou
Je pense que les commandes ci-dessus calculent le nombre de noms de fichiers et de répertoires
*.mp4
donc je vous suggère d'utiliser l'
-type f
option commefind
paramètre comme suit.En outre,
ls -lR
peut être utilisé commefind .
la source
Vous pourriez utiliser
ls -1 *.mp4 | wc -l
.Cela listera tous les fichiers se terminant par
.mp4
, imprimant chaque fichier sur une nouvelle ligne (ls -1 *.mp4
),wc
dirigera la sortie vers laquelle comptera le nombre de nouvelles lignes en utilisant l'-l
indicateur.la source
*.mp4
est développé par le shell, nonls
, cela échouera s'il y a tellement de.mp4
fichiers dans le répertoire que leur liste ne peut pas être passéels
en arguments.--.mp4
--
résoudra le deuxième cas; le premier affichera un message d'erreur (vous avez besoin de beaucoup de fichiers!) et une autre belle question ici. Des cas d'angle, mais qui valent la peine d'être remarqués, oui.-q
ou-b
, cela ne tolère pas les retours à la ligne dans les noms de fichiers. Si vous exécutez àls -1 *.mp4
partir de votre terminal sans tuyau,ls
voit sa sortie standard est un terminal et prend-q
comme implicite, l'impression?
s. Mais ce comportement disparaît lorsque la sortie est canalisée.ls -1 *.mp4 | wc -l
surfacturations s'il y a des nouvelles lignes.ls -1 *.mp4 | cat
montre ce quewc
"voit". (De même,-1
est implicite lorsque stdout n'est pas un terminal, il est donc facultatif.)ls -1q -- *.mp4 | wc -l
Fonctionne presque, mais pas avec zéro fichier .mp4.Cela devrait vous donner la liste des fichiers avec .mp4
Lorsqu'il est combiné avec
wc -l
vous donnera un comptesi vous souhaitez que la recherche inclue des sous-répertoires
la source
wc -l
ls /directory/*.mp4
amène le shell à étendre le glob et à exécuter quelque chose commels /directory/file1.mp4 /directory/file2.mp4 ...
ceci échouera si le répertoire contient plus de fichiers mp4 que ce qui peut être passé en argumentls
.En bash, un recours à froid à l'utilisation de tableaux avec glob:
la source
Remplacez (.csv par l'extension souhaitée)
Explication: Je pense qu'un schéma simple consiste à récupérer la liste des fichiers et à compter l'extension avec grep.
\.
pour correspondre.
et$
pour faire correspondre l'extension à la fin de la ligne. Cela fonctionne parce que lorsque la sortie de ls est canalisée, un nom de fichier est envoyé par ligne, que vous pouvez vérifier en exécutant:la source
grep --count
, vous pouvez également utilisergrep -c
.Vérifiez comment compter les fichiers par extension sous Linux? , il donne une bonne réponse et explication, vous pouvez utiliser la commande suivante:
la source