Encontre o menor arquivo

19

Objetivo:

Crie um programa para encontrar o menor arquivo na pasta atual.

  • O tamanho do arquivo pode ser medido em bytes ou caracteres.
  • Se vários arquivos tiverem o mesmo tamanho, você poderá escolher um ou exibir todos eles.
  • Você pode assumir que haverá pelo menos um arquivo na pasta e nenhum arquivo terá o tamanho 0.
  • Suponha que todos os arquivos da pasta possam ser carregados pelo idioma que você está usando.

  • Suponha que não haja pastas no diretório atual.

Entrada:

O programa não deve receber nenhuma entrada do usuário, a menos que:

  • Se o seu idioma não tiver uma "pasta atual", ele poderá solicitar ao usuário o nome / caminho da pasta.
  • Se o seu idioma não puder acessar arquivos diretamente no seu computador, poderá permitir que o usuário faça o upload de arquivos. (JavaScript, por exemplo)

Resultado:

O nome do menor arquivo deve ser exibido.

  • Símbolos iniciais / finais são permitidos, desde que fique claro qual arquivo foi escolhido.
  • (Imprimir uma lista de todos os arquivos é contra as regras).

Notas:

  • As brechas padrão não são permitidas.
  • Você não pode modificar / criar / excluir arquivos na pasta para alterar o resultado.
  • Isso é ; a resposta mais curta (em bytes) vence.
12Me21
fonte
11
Podemos assumir que os arquivos podem ter o tamanho 0?
Rɪᴋᴇʀ
Além disso, o que "pressupõe que todos os arquivos na pasta possam ser acessados" significa? isso significa que os arquivos ocultos não precisam ser exibidos?
Rɪᴋᴇʀ
2
Posso assumir que não há pastas na pasta atual? Faz toda a diferença se você tiver uma função de idioma que retorne arquivos e pastas em vez de apenas arquivos!
sergiol 28/01
11
Não necessariamente. Você pode presumir que não há diretórios dentro do diretório atual é inequívoco e não invalida nenhuma resposta.
Dennis
11
(desculpe-me por não ter respondido antes, minha conexão com a internet ficou inativa por alguns dias) O problema que tenho ao permitir que você pule arquivos ocultos é que parece abrir muitas brechas. Permitir que você pule arquivos que são "um pouco mais difíceis de acessar" significa que as pessoas podem fazer algo como apenas verificar os 9 primeiros arquivos, pois economiza alguns bytes.
12Me21

Respostas:

7

Vim 12 bytes

!!ls -Sa
Gd{

Experimente online!

Explicação:

!!é o comando de filtro . Ele canaliza o conteúdo da linha atual para um comando arbitrário do sistema e envia a saída de volta ao buffer. É útil para usar ferramentas externas para coisas nas quais o bash é melhor que o vim, por exemplo, !!revpara reverter a linha atual ou !Gxxdfazer o dump hexadecimal do buffer. No nosso caso, o buffer está vazio, portanto é equivalente a :r!ls, o que apenas alimenta a saída do comando na linha atual.

Agora, o cursor está na linha 1 e queremos excluir todas as linhas, menos a última. A abordagem ingênua é

G       " Go to the last line
 k      " Go up one line
  d     " Delete:
   gg   "   Everything up to the first line

Mas nós podemos fazer melhor. Como expliquei nesta dica , geralmente{ pode (mas nem sempre) ser equivalente a . Aqui é ainda melhor. Porque o movimento é baseado em caracteres , não baseado em linhas como é, não tem que ir até uma linha em primeiro lugar, deixando-nos comgggg

Gd{
DJMcMayhem
fonte
16

Bash + coreutils, 13 bytes

ls -Sar|sed q

Explicação:

ls -Sar|sed q
ls            # list files
   -S         # sorted, biggest first
     a        # show hidden files
      r       # reversed (smallest first)
       |sed q # q is quit at first line that matches given regex, 
              # given regex is empty so guaranteed match.         
Rɪᴋᴇʀ
fonte
Publiquei isso como minha própria resposta, mas acho que é muito semelhante à sua. ls -1Sa|tail -1é 3 bytes mais curto e possui uma saída mais limpa.
orlp
! @orlp graças ..
Rɪᴋᴇʀ
11
Eu não acho que você precise do '-1', o pipe coloca automaticamente um arquivo por linha.
GB
@EasterlyIrk acho que GB está certo. se lsdetecta a saída no terminal, ele formatará a saída em várias colunas. Mas, se a saída for um canal, será apenas 1 por linha. Compare lsvsls|cat
Digital Trauma
Dois bytes mais curtos:ls -Sar|sed q
Digital Trauma
8

Python 2 3, 94 76 74 54 bytes

-18 bytes graças a @orlp
-2 bytes graças a @ Jonathan Allan
-20 bytes graças a uma alteração nas especificações dos desafios

from os import*
print(min(listdir(),key=path.getsize))
ovs
fonte
print min(filter(path.isfile,listdir(".")),key=path.getsize)é mais limpo e substancialmente mais curto.
orlp
Salve dois bytes movendo-se para o Python 3, pois "."é o padrão. print(min(filter(path.isfile,listdir()),key=path.getsize))
Jonathan Allan
Também conto 76 e não 77.
Jonathan Allan
@JonathanAllan Eu medi a contagem de bytes wcque me deu mais 1 byte
ov 27/01
O byte estranho seria devido a uma nova linha à direita, que não é necessária para o Python. Além disso, como o desafio foi atualizado para indicar que não há subdiretórios presentes, o filterbit inteiro é desnecessário. Isso também não funciona no Python 3, pois printé uma função. O seguinte funcionaria e seria substancialmente mais curto:print(min(listdir(),key=path.getsize))
Mego 28/01
8

PowerShell , 30 24 21 bytes

(ls|sort le*)[0].Name

Experimente online!

lsé um alias para Get-ChildItem. Isso é canalizado sort-objectcom o lengthatributo, para que os arquivos sejam classificados por tamanho. Nós indexamos isso com o (...)[0]para obter o primeiro (ou seja, o menor) e, em seguida, obtemos o .Namemesmo. A saída via implícita Write-Outputacontece na conclusão do programa.

Economizou 6 bytes, pois garantimos a existência de apenas arquivos no diretório. Economizou mais 3 graças ao ConnorLSW.

AdmBorkBork
fonte
2
Você não consegue se livrar dos -filearquivos existentes no diretório atual?
Mutantoe 28/01
@ Mutantoe Sim - que foi editado no desafio depois que eu postei esta resposta. Obrigado!
AdmBorkBork 29/01
você pode usar sort le*para raspar alguns bytes, pois o PowerShell o aceitará.
colsw
@ConnorLSW Sim, é claro. Obrigado!
AdmBorkBork 30/01
7

Ruby, 61 40 38 37 bytes

Obrigado GB e Value Ink

p Dir[?*,".*"].min_by{|x|File.size x}
dkudriavtsev
fonte
Você pode usar ?. em vez de Dir.pwd e min_by {} para obter o menor arquivo. Dir.foreach(?.).min_by{|x|File.size x}obtém o mesmo resultado em 38 bytes.
GB
@GB Thanks!
dkudriavtsev
É uma pena que "todos" os arquivos que o idioma possa acessar devam ser vistos, porque Dir[?*]é muito mais curto, mas não inclui arquivos Unix ocultos, como .bash_profile...
Value Ink
Talvez Dir [? *, ".? *"] Possa funcionar. Eu não tentei. E é mais curto.
GB
@ GB Realmente seria Dir[?*,".*"]. A seqüência de globos .?*não corresponderá ao arquivo, .ase existir.
Value Ink
6

Mathematica, 35 bytes

FileNames[]~MinimalBy~FileByteCount

FileNames[]produz uma lista de nomes de todos os arquivos (e diretórios) no diretório atual; ~MinimalBy~FileByteCountseleciona o nome do arquivo cuja contagem de bytes é menor. FileByteCountlança um monte de erros quando aplicado a diretórios, mas os erros não inviabilizam o programa.

Greg Martin
fonte
6

Java 7, 149 142 bytes

String f(){String n="";long s=-1>>>1,p;for(java.io.File f:new java.io.File(".").listFiles())if((p=f.length())<s){n=f.getName();s=p;}return n;}

Experimente online!

-7 bytes graças a CAD97

Cutucar
fonte
Eu acho que você quer File :: comprimento não arquivo :: getTotalSpace
CAD97
Não testado Java 8: ()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()para 104 bytes
CAD97
@ CAD97 Você está certo! O que eu estava pensando ...
Puxão
6

SH (Linux / Unix) 15 14 13 14 bytes

ls -aS|tail -1

-S classifica por tamanho (decrescente),

-rinverte e tail -1gera o último arquivo na lista.

@ Dennis Obrigado por salvar 1 byte @Dani_l Obrigado por salvar 1 byte.

Abel Tom
fonte
Que encontra o maior arquivo, não?
Dennis
Deixa pra lá, estou cansado. Você pode usar tailembora, em vez de reverter, e -1é uma abreviação de -n1.
Dennis
@Dennis Updated
Abel Tom
@EasterlyIrk Agora deve :)
Abel Tom
@AbelTom legal, obrigado pela correção.
Rɪᴋᴇʀ
4

MATLAB / Oitava, 52 48 bytes

d=dir;[~,n]=min([d.bytes]./~[d.isdir]);d(n).name

Explicação

Isso obtém uma lista de diretórios de todos os arquivos e pastas no diretório atual usando dir. A saída de diré um structcontendo o nome do arquivo, seja um diretório ou não, o tamanho (em bytes) etc.

Podemos então pegar uma matriz dos tamanhos de cada um em bytes [d.bytes]e executar a divisão elemento a elemento com um booleano indicando se é um diretório ou não ~[d.isdir]que produzirá Infonde é um diretório (divisão por zero) e o tamanho em bytes caso contrário (divisão por 1)

Nós encontramos o índice do mínimo dessa matriz usando a segunda saída de mine usamos isso para indexar na estrutura inicial e exibir o nome comd(n).name

Suever
fonte
Você deve adicionar em disp(...)torno da saída para imprimi-la corretamente. Caso contrário, se, por exemplo, houvesse um arquivo chamado ansque não fosse o menor da pasta, a saída não seria clara sobre qual arquivo é o menor para quem não conhece o MATLAB.
Tom Carpenter
@TomCarpenter Hmmm eu interpretei "Leading / arrastando símbolos são permitidos, desde que fique claro qual arquivo foi escolhido" para significar que o ans = é ok
Suever
Acabei de perceber que o MATLAB adiciona o implícito .(pasta atual) e ..(pasta acima), por isso não consigo remover o diretório que parece. Me desculpe por isso.
Tom Carpenter
4

Scala, 52 bytes

Versão antiga, 79 bytes

new java.io.File(".").listFiles.map(a=>a.getName->a.length)sortBy(_._2)apply(0)

Ajustado de acordo com o conselho de jaxad0127. Agora são apenas 52 bytes.

new java.io.File(".").listFiles.sortBy(_.length)head
Aria Axe
fonte
Usar cabeça em vez de aplicar (0) é mais curto. Além disso, o método toString de File é bom, não é necessário chamar get name.
precisa saber é o seguinte
4

Lote, 43 39 35 bytes

@dir/b/os|(set/pf=&call echo %%f%%)

A saída inclui um espaço de liderança por algum motivo, mas felizmente isso é permitido. Edit: Agora, assumindo que não há diretórios para salvar 4 bytes.

Neil
fonte
Oh, usando / p assim, dang inteligente!
AdmBorkBork 27/01
@AdmBorkBork Ah, eu não tinha notado que isso era permitido, obrigado!
Neil
Você está garantido que não existem subdiretórios (o desafio foi atualizado) para poder eliminar o /a-d.
AdmBorkBork 29/01
4

Perl 6 ,  33 32 31  16 bytes

'.'.IO.dir.grep(*.f).min(*.s).put

Tente

put '.'.IO.dir.min:{try .s//Inf}

Tente

put $*CWD.dir.min:{try .s//Inf}

Tente

put dir.min: *.s

Tente

Expandido:

put        # print with trailing newline
dir        # the list of files in the current directory
.min:      # find the minimum by
  *.s      # calling the `s` method (size) in a Whatever lambda
Brad Gilbert b2gills
fonte
O formato da função é dirpadronizado como $*CWD, e a descrição da tarefa diz que você pode assumir que não haverá pastas, então acho que você pode reduzi-lo dir.min(*.s).put.
SMLS
Quando escrevi isso, ele disse que o programa deve ignorar pastas.
precisa saber é o seguinte
4

J , 21 20 bytes

>{.,(/:2&{"1)1!:0'*'

Guardou um byte graças a @ Conor .

Explicação

>{.,(/:2&{"1)1!:0'*'
                 '*' Glob all files in current directory
             1!:0    Table of file metadata in that directory
       2&{"1         Get the file size of each
     /:              Sort the files by that
   ,                 Flatten
 {.                  Get the first value
>                    Unbox
milhas
fonte
@ ConorO'Brien Thanks
miles
3

Arquivo BATCH, 77 72 63 bytes

@FOR /F "tokens=*" %%G IN ('dir/o-s/b') DO @SET F=%%G
@ECHO %F%

Não existe um equivalente direto de headou tailno BATCH, pelo menos ao meu conhecimento, então aqui está uma solução alternativa. (com muita ajuda da @Neil - obrigado!)

O dircomando, com /o-spara classificar no tamanho do arquivo decrescente e /bpara gerar apenas os nomes dos arquivos. Percorremos aqueles com FOR /F, definindo a variável Fpara o nome do arquivo a cada vez. Finalmente, produzimos apenas o último com ECHO %F%.

Economizou mais 9 bytes graças a Neil e graças a garantias de que nenhum diretório está presente.

AdmBorkBork
fonte
11
Sua FORvariável precisa de dois %s para trabalhar em um script. Caso contrário, alguns truques de golfe: 1. Não use @ECHO OFFem scripts curtos, adicione a @a cada linha e depois DO. 2. Exclua o espaço antes DO. 3. Os espaços :es não são necessários no dircomando.
Neil
11
@ Neil Ack, obrigado. Desculpe, muito enferrujado desde que eu estive no PowerShell ... Obrigado!
AdmBorkBork 27/01
3

PHP, 84 62 bytes

$t=array_map(filesize,$g=glob('*'));asort($t);echo$g[key($t)];

Como a pergunta foi atualizada com a suposição de que não haverá pastas no diretório atual, consegui remover o material de verificação de arquivo e reduzi-lo.


Aqui está a minha resposta antiga:

$t=array_map(filesize,$g=array_filter(glob('*'),is_file));asort($t);echo$g[key($t)];

Isso é o melhor que eu poderia fazer. Talvez exista uma maneira melhor de me perder.

$t=array_map(              # visit each array element and...
    filesize,              # map each filename to its filesize...
    $g=array_filter(       # using an array of...
        glob('*'),         # all files and directories...
        is_file            # filtered by files...
    )                      # 
);                         # 
asort($t);                 # sort the array of filesizes, then...
echo$g[key($t)];           # print element from the array of files using the first key of the sorted array as an index
Kodos Johnson
fonte
2

Node.js (usando walk), 114 bytes

Ignorar nova linha:

require('walk').walk(__dirname).on('file',(r,s,n)=>
(m=s.size>m.size?m:s,n()),m=0).on('end',_=>console.log(m.name))

Isso chama um andador que percorre o diretório atual ( __dirname) e, para cada arquivo, chama uma função com seu stat se uma função a seguir n()que deve ser chamada para continuar a travessia. Em seguida, no end, ele imprime um nome de arquivo com o mínimo sizede bytes encontrado. s.size>m.sizeretorna falsequando m.sizeé undefined, por isso, após o primeiro retorno de chamada, mé igual ao primeiro ficheiro encontrado e continua de lá normalmente.

Patrick Roberts
fonte
2

R, 36 bytes

x=file.info(y<-dir())$s;y[x==min(x)]

Explicado

file.info()retorna uma data.framedas "informações do arquivo" quando recebe um caractere ou vetor de caracteres de nomes de arquivos / pastas que, quando usados ​​na lista de arquivos / pastas no diretório atual ( dir()), se parecem com:

                                                               size isdir mode               mtime               ctime               atime exe
Polyspace_Workspace                                               0  TRUE  777 2014-11-28 17:29:25 2014-11-28 17:29:25 2014-11-28 17:29:25  no
Python Scripts                                                    0  TRUE  777 2016-03-21 23:59:41 2016-03-21 23:59:41 2016-03-21 23:59:41  no
R                                                                 0  TRUE  777 2015-12-23 20:11:02 2015-12-23 20:11:02 2015-12-23 20:11:02  no
Rockstar Games                                                    0  TRUE  777 2015-04-14 12:23:05 2015-04-14 12:23:03 2015-04-14 12:23:05  no
TrackmaniaTurbo                                                   0  TRUE  777 2016-03-24 17:15:05 2016-03-24 13:13:48 2016-03-24 17:15:05  no
ts3_clientui-win64-1394624943-2014-06-11 03_18_47.004772.dmp 314197 FALSE  666 2014-06-11 02:18:47 2014-06-11 02:18:47 2014-06-11 02:18:47  no

Posteriormente, apenas encontramos o nome do arquivo para o qual a sizecoluna (abreviada usando$s ) é a menor. Conseqüentemente, se houver mais de um arquivo com o menor tamanho, todos serão retornados.

Bônus: se também quiséssemos desconsiderar pastas no diretório atual, poderíamos simplesmente procurar o tamanho quando isdir == FALSE: x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]que é 44 bytes.

Billywob
fonte
Um pouco tarde, mas file.sizeé mais curto, porque você não precisa fazer isso $sdepois.
JAD
2

Tcl , 88 bytes

set s Inf
lmap f [glob -ty f *] {if [set m [file si $f]]<$s {set n $f
set s $m}}
puts $n

Experimente online!

sergiol
fonte
2

SmileBASIC, 110 bytes

DIM F$[0]FILES"TXT:",F$FOR I=0TO LEN(F$)-1F$[I][0]="TXT:
S=LEN(LOAD(F$[I],0))IF!Z||S<Z THEN Z=S:B=I
NEXT?F$[B]

Examina apenas os TXT:arquivos, pois os DAT:arquivos não podem ser carregados, a menos que você já saiba o tamanho deles, impossibilitando o carregamento aleatório.

12Me21
fonte
Como você carrega um DAT: arquivo? Você poderia forçar com força todos os nomes / tamanhos de arquivo da pasta?
Pavel
Tentar carregar um DAT:arquivo tridimensional em uma matriz bidimensional (por exemplo) causará um erro, portanto você não pode forçá-lo com força bruta. Você só precisa saber o número de dimensões de antemão, o que normalmente faria.
12Me21
Você poderia carregar um DAT: arquivo 2D em uma matriz 3D? Então você pode criar uma matriz de tamanho máximo. E você não pode pegar erros de forma alguma?
Pavel
Não, isso causará um erro de incompatibilidade de tipo. E também não há como detectar erros.
12Me21
1

Groovy , 49 bytes

m={f->f.listFiles().sort{it.length()}[0].getName()}

Experimente online!

Encerramento, uso: m(new File("location"))

Urna de polvo mágico
fonte
1

C #, 277 bytes

Não é o mais curto, mas o que você esperaria de C #?

Golfe

using System.Linq;using static System.IO.Directory;class P{static void Main(){var x=GetFiles(GetCurrentDirectory());var d=new long[]{}.ToList();foreach(var s in x){var b=new System.IO.FileInfo(s).Length;if(!d.Contains(b))d.Add(b);}System.Console.Write(x[d.IndexOf(d.Min())]);}}

Ungolfed

//Linq using for List.Min()
using System.Linq;
//Static using to save bytes on GetCurrentDirectory() and GetFiles()
using static System.IO.Directory;

class P
{
    static void Main()
    {
        //String array containing file paths
        var x = GetFiles(GetCurrentDirectory());
        //Creating a Long array and converting it to a list, less bytes than "new System.Collections.Generic.List<long>()"
        var d = new long[] { }.ToList();
        foreach (var s in x) //Loop through all file paths
        {
            //Getting file size in bytes
            var b = new System.IO.FileInfo(s).Length;
            if (!d.Contains(b))
                //If there isn't already a file with this size in our List, add the file path to list
                d.Add(b);

        }
        //Get index of the smallest Long in our List, which is also the index of the file path to the smallest file, then write that path
        System.Console.Write(x[d.IndexOf(d.Min())]);
    }
}
Metoniem
fonte
1

Röda , 32 31 bytes

{ls""|sort key=fileLength|pull}

É uma função anônima que classifica os arquivos no diretório atual por tamanho e seleciona o primeiro arquivo com pull.

Use-o assim: main{ {ls""|sort key=fileLength|pull} }

fergusq
fonte
Aparentemente, ls""funciona tão bem quanto ls".". Eu acho que você pode salvar um byte de que
Kritixi Lithos
@KritixiLithos Parece que sim. Obrigado!
Fergusq 7/03/2017
0

SmileBASIC 3, 105 bytes (competindo?)

Bate a resposta de 12Me21 mas ainda sofre com a incapacidade de carregar arquivos DAT (que parece muito cruel ao ser desqualificado, considerando as circunstâncias).

DIM F$[0],T[0]FILES"TXT:",F$FOR I=0TO LEN(F$)-1F$[I][0]="TXT:
PUSH T,LEN(LOAD(F$[I]))NEXT
SORT T,F$?F$[0]

A versão mais curta acima é irritante e solicita que você carregue todos os arquivos, mas funciona. Por mais dois bytes, você pode suprimir o prompt; mude a linha 2 para isto:

PUSH T,LEN(LOAD(F$[I],0))NEXT
Caracol_
fonte
0

Arquivo em lote, 33 bytes

Desta vez, arquivos em lote são moderadamente competitivos, por incrível que pareça.

@dir/os/b>..\q&set/pa=<..\q&"%a%.

Resultado

insira a descrição da imagem aqui


Encontre uma maneira de interromper a criação do qantes de dir/os/bser executado e você economizará no máximo 6 bytes por não precisar colocar o arquivo de saída em um diretório separado.

@dir/os/b>q&set/pa=<q&"%a%

Sempre será exibido qcomo o menor arquivo (a menos que esteja vinculado a outro arquivo de 0 byte), pois é criado como um arquivo vazio antes de dir/b/osreunir uma lista de arquivos.

BDM
fonte
0

C ++ 17 (gcc) , 180 bytes

#include<filesystem>
using namespace std::filesystem;auto f(){std::error_code e;path r;size_t m=-1,s;for(auto&p:directory_iterator(".")){s=file_size(p,e);if(s<m)m=s,r=p;}return r;}

Experimente online!

Requer uma biblioteca padrão recente que implementa std::filesystem.

G. Sliepen
fonte