Quero contar o número total de arquivos em um diretório específico que termina com a extensão ".mp4".
Estou recebendo o seguinte comando:
ls -F |grep -v / | wc -l
Ele conta todos os arquivos em um diretório específico, mas quero a contagem de arquivos que terminam com a extensão .mp4.
Existe algum comando do Ubuntu para isso?
command-line
ls
Prakash V Holkar
fonte
fonte
ls -1
o manuseio de caracteres de nova linha torna, nesse caso, sensato analisar als
saída. O marcado está errado para o uso do sinalizador -R.Respostas:
Aqui você pode fazer assim
Isso lhe dá contar
fonte
-R
? Por que fazer um fullstat
quando você só precisa do nome do arquivo? Por que nãols -1 *.jpg| wc -l
? (ok, não funciona se você tiver nomes de arquivos com novas linhas na mesma Nesse caso, você merece isso ;-) ....).jpg
. Você já testou?*.jpg
é expandido pelo shell, não porls
) e se houver arquivos cujos nomes começam com hífens..
. Mas na verdade funciona bem com hífens nos nomes, exceto quando/path/to/dir
a string vazia ou um caminho relativo começa com um hífen. Mas eu estava errado antes de dizer quels
substitui caracteres por?
. Isso acontece quando stdout é um terminal, mas aqui a saída é um canal, entãols
envia todos os caracteres dos nomes de arquivos parawc
. Isso faz com que esta resposta esteja errada sem o sinalizador-q
ou-b
para alterar esse comportamento , porque os nomes de arquivos podem conter novas linhas. A resposta de 10b0 está livre desses problemas.Infelizmente, esse problema benigno é difícil de resolver de uma maneira que suporta todos os nomes de arquivos e é portátil. Isso é seguro (ele lida com arquivos ocultos, caminhos contendo espaços, traços e até novas linhas)
e compatível com POSIX:Se você não quiser que seja recursivo, basta adicionar
-maxdepth 1
.Você não deve analisar a
ls
saída.Teste:
Compare com a resposta aceita :
Ou outras sugestões:
fonte
-printf x
vez de-exec printf x \;
. Isto é:find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
Não há nenhuma necessidade para-exec
o externoprintf
comando, que se houver muitos arquivos será muito lento , porquefind
tem que fork (2) fora de uma cópia de si mesmo e, em seguida, execve (2)/usr/bin/printf
. Com-exec printf x \;
, isso deve ser feito uma vez para cada arquivo .-printf
não é suportado no POSIXfind
, razão pela qual não o usei.-mindepth
e-maxdepth
, que você usou.find
contém-mindepth
e-maxdepth
não contém,-printf
então eu aprecio a inclusão de ambos.Este encontra, classifica e lista todos os arquivos por extensão em ordem:
fonte
| sort -rn
no final e talvez um-mindepth 1
se apenas atual.head -n
o topo n.Eu acho que é muito simples como seguir os comandos.
ou
Eu acho que os comandos acima calculam a contagem de nomes de arquivos e diretórios
*.mp4
então eu sugiro que você use a
-type f
opção comofind
parâmetro da seguinte maneira.Além disso,
ls -lR
pode ser usado comofind .
fonte
Você poderia usar
ls -1 *.mp4 | wc -l
.Isso listará todos os arquivos que terminam em
.mp4
, imprimindo cada arquivo em uma nova linha (ls -1 *.mp4
), canalizando a saída nawc
qual contará o número de novas linhas usando o-l
sinalizador.fonte
*.mp4
é expandido pelo shell,ls
isso não ocorrerá se houver tantos.mp4
arquivos no diretório que a lista deles não possa ser transmitidals
como argumento.--.mp4
--
resolverá o segundo caso; o primeiro apresentará uma mensagem de erro (você precisa de muitos arquivos!) e outra boa pergunta aqui. Casos de canto, mas vale a pena notar, sim.-q
ou-b
, isso não tolera novas linhas nos nomes de arquivos. Se vocêls -1 *.mp4
sair do terminal sem tubulação,ls
vê que o stdout é um terminal e assume-q
como implícito, a impressão de?
s. Mas esse comportamento desaparece quando a saída é canalizada.ls -1 *.mp4 | wc -l
superconta se houver novas linhas.ls -1 *.mp4 | cat
mostra o quewc
"vê". (Da mesma forma,-1
está implícito quando stdout não é um terminal, portanto é opcional.)ls -1q -- *.mp4 | wc -l
Quase funciona, mas não com zero arquivos .mp4.Isso deve fornecer a lista de arquivos com .mp4
Quando combinado com
wc -l
lhe dará a contagemse você deseja procurar incluir subdiretórios
fonte
wc -l
ls /directory/*.mp4
faz com que o shell expanda o globo e execute algo comols /directory/file1.mp4 /directory/file2.mp4 ...
Isso falhará se o diretório contiver mais arquivos mp4 do que os que podem ser passados como argumentosls
.No bash, um recurso frio para usar matrizes com glob:
fonte
Substitua (.csv pela extensão desejada)
Explicação: Eu acho que um esquema simples é buscar a lista de arquivos e contar a extensão com grep.
\.
para corresponder.
e$
corresponder à extensão no final da linha. Funciona porque quando a saída de ls é canalizada, um nome de arquivo é enviado por linha, que você pode verificar executando:fonte
grep --count
, você também pode usargrep -c
.Verifique como contar os arquivos por extensão no Linux? , fornece uma boa resposta e explicação, você pode usar o seguinte comando:
fonte