查找最小的文件


19

目标:

创建一个程序以查找当前文件夹中的最小文件。

  • 文件大小可以字节或字符为单位。
  • 如果多个文件具有相同的大小,则可以选择一个或全部显示。
  • 您可以假定文件夹中至少有一个文件,并且没有文件的大小为0。
  • 假设可以使用您所使用的语言加载文件夹中的所有文件。

  • 假设当前目录中没有文件夹。

输入:

该程序不应接受用户的任何输入,除非:

  • 如果您的语言没有“当前文件夹”,则可能会询问用户文件夹名称/路径。
  • 如果您的语言无法直接访问计算机上的文件,则可能允许用户上载文件。(例如JavaScript)

输出:

应该显示最小文件的名称。

  • 只要清楚地选择了哪个文件,就允许使用前导/尾随符号。
  • (打印所有文件的列表是违反规则的)。

笔记:

  • 不允许使用标准漏洞
  • 您不能修改/创建/删除文件夹中的文件来更改结果。
  • 这是;最短答案(以字节为单位)获胜。

1
我们可以假设文件可以有一个大小为0?
Rɪᴋᴇʀ

另外,“假定可以访问文件夹中的所有文件”是什么意思?这是否意味着不需要显示隐藏文件?
Rɪᴋᴇʀ

2
我可以假定当前文件夹上没有文件夹吗?如果您具有返回文件和文件夹而不是仅返回文件的语言功能,那么一切都将不同!
sergiol

1
不必要。您可以假定当前目录中没有目录是明确的,并且不会使任何答案无效。
丹尼斯,

1
(对不起,我没有更快地回复,我的互联网连接已经断开了几天)我允许您跳过隐藏文件的问题是,它似乎打开了很多漏洞。允许您跳过“稍难访问”的文件将意味着人们可以执行一些操作,例如仅检查前9个文件,因为它节省了一些字节。
17Me21年

Answers:


7

Vim 12个字节

!!ls -Sa
Gd{

在线尝试!

说明:

!!过滤器命令。它将当前行的内容通过管道传递给任意系统命令,然后将输出发送回缓冲区。对于使用bash比vim更擅长的事情使用外部工具很有用,例如!!rev反转当前行或!Gxxd十六进制转储缓冲区。在我们的例子中,缓冲区是空的,因此等效于:r!ls,它只是将命令的输出馈送到当前行。

现在光标位于第1行,我们要删除除最后一行以外的每一行。天真的方法是

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

但是我们可以做得更好。就像我在解释这个提示中,{可以一般(但不总是)等同于gg。在这里,甚至更好。因为动作是基于字符的,而不是像基于行的那样gg,所以我们不必先上一行,

Gd{

16

Bash + coreutils,13个字节

ls -Sar|sed q

说明:

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.         

将此作为我自己的答案发布,但我认为它与您的答案太相似。ls -1Sa|tail -1短3个字节,输出更清晰。
Orlp

!@orlp感谢..
Rɪᴋᴇʀ

1
我认为您不需要'-1',管道会自动在每行放置一个文件。
GB

@EasterlyIrk我认为GB是正确的。如果ls检测到输出到终端,它将把输出格式化为多列。但是,如果输出是管道,则每行只做1个。比较lsvsls|cat
数字创伤

缩短两个字节:ls -Sar|sed q
数字创伤

8

2 3,94 76 74 54个字节

@ orlp,-18个字节,@
Jonathan Allan,-2个
字节,挑战规范的变化,-20个字节

from os import*
print(min(listdir(),key=path.getsize))

print min(filter(path.isfile,listdir(".")),key=path.getsize)更干净,更短。
orlp

由于这"."是默认设置,因此请保存两个字节以移至Python 3 。print(min(filter(path.isfile,listdir()),key=path.getsize))
乔纳森·艾伦

我也算没有76 77
乔纳森·艾伦

@JonathanAllan我测量了字节计数,wc这使我再增加1个字节
ovs

多余的字节归因于尾随换行符,Python不需要。另外,由于已更新质询以声明不存在子目录,因此不需要全部filter内容。这print是一个函数,因此在Python 3中也不起作用。以下内容将起作用,并且大大缩短:print(min(listdir(),key=path.getsize))
Mego

8

PowerShell30 24 21字节

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

在线尝试!

ls是的别名Get-ChildItem。这是通过管道输送到sort-objectlength属性,因此该文件由大小排序。我们使用索引到该索引中(...)[0]以得到第一个(即最小的),然后取.Name其中的一个。通过隐式输出Write-Output在程序完成时发生。

由于我们确保目录中仅存在文件,因此节省了6个字节。多亏了ConnorLSW,节省了3欧元。


2
-file因为只有文件位于当前目录中,您不能摆脱吗?
Mutantoe

@Mutantoe是的-在我发布此答案后,已将其编辑为挑战。谢谢!
AdmBorkBork

您可以sort le*用来剃除一些字节,因为powershell会接受它。
colsw

@ConnorLSW是的,当然。谢谢!
AdmBorkBork

7

Ruby,61 40 38 37字节

感谢GB和超值墨水

p Dir[?*,".*"].min_by{|x|File.size x}

您可以使用 ?。而不是Dir.pwd和min_by {}来获取最小的文件。Dir.foreach(?.).min_by{|x|File.size x}在38个字节中得到相同的结果。
GB

@GB谢谢!
dkudriavtsev

遗憾的是,必须查看语言可以访问的“所有”文件,因为Dir[?*]文件要短得多,但不包括隐藏的Unix文件,例如.bash_profile...
Value Ink

也许Dir [?*,“。?*”]可以工作。我没试过 而且更短。
GB

@GB实际上是Dir[?*,".*"]。Glob字符串.?*与文件不匹配(.a如果存在)。
价值墨水

6

Mathematica,35个字节

FileNames[]~MinimalBy~FileByteCount

FileNames[]产生当前目录中所有文件(和目录)的名称列表;~MinimalBy~FileByteCount选择字节数最小的文件名。FileByteCount将其应用于目录时会引发很多错误,但是这些错误不会使程序脱轨。


6

Java 7中,149个 142字节

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;}

在线尝试!

-7字节归功于CAD97


我认为您想要File :: length而不是File :: getTotalSpace
CAD97

未经测试的Java 8:()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()104个字节
CAD97,2017年

@ CAD97你是对的!我在想什么...

6

SH(Linux / Unix)15 14 13 14字节

ls -aS|tail -1

-S 按大小排序(降序),

-r反转tail -1输出列表中的最后一个文件。

@ Dennis感谢您保存1个字节@Dani_l感谢您保存1个字节。


那找到最大的文件,不是吗?
丹尼斯,

没关系,我很累。您可以使用tail不过来代替,这-1是的简写-n1
丹尼斯,

@丹尼斯更新
亚伯汤姆

@EasterlyIrk现在应该:)
Abel Tom

@AbelTom很酷,谢谢修复。
Rɪᴋᴇʀ

4

MATLAB /八度,52 48字节

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

说明

这会使用列出当前目录中所有文件和文件夹的目录dir。的输出dir是一个struct包含文件名的文件,无论它是否是目录,大小(以字节为单位)等。

然后,我们可以采取每个的尺寸的阵列以字节为单位[d.bytes],并用一个布尔值,指示它是否是一个目录或不执行逐元素除法~[d.isdir]这将产生Inf其中它的一个目录(除零),并在以其他方式字节大小(除以1)。

我们使用的第二个输出找到该数组的最小值的索引,min并使用该索引来索引初始结构并使用d(n).name


您应该添加disp(...)输出以正确打印它。否则,例如,如果存在一个名为的文件ans,该文件不是文件夹中的最小文件,那么对于不熟悉MATLAB的任何人来说,输出的内容将不清楚。
汤姆·卡彭特

@TomCarpenter Hmmm我解释为“允许使用领先/后跟符号,只要清楚选择了哪个文件即可”,这ans = 表示没关系
Suever

我刚刚意识到MATLAB添加了隐式的.(当前文件夹)和..(上面的文件夹),所以似乎无法删除目录检查。对于那个很抱歉。
汤姆·卡彭特

4

Scala,52个字节

旧版本,79字节

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

根据jaxad0127的建议进行了调整。现在只有52个字节。

new java.io.File(".").listFiles.sortBy(_.length)head

使用head代替apply(0)较短。另外,File的toString方法很好,不需要调用get名称。
jaxad0127 '17

4

批处理,43 39 35字节

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

由于某种原因,输出中包含前导空格,但幸运的是,这是允许的。编辑:现在假设没有目录保存4个字节。


哦,那样使用/ p,巧!
AdmBorkBork

@AdmBorkBork啊,我没有注意到那是允许的,谢谢!
尼尔

您可以确保不存在任何子目录(挑战已更新),因此可以消除/a-d
AdmBorkBork

4

Perl 6的 33个32 31  16字节

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

尝试一下

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

尝试一下

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

尝试一下

put dir.min: *.s

尝试一下

展开:

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

函数形式dir默认为$*CWD,任务描述说您可以假设没有任何文件夹,因此我认为可以将其缩短为dir.min(*.s).put
smls

当我写这篇文章时,它说程序必须忽略文件夹。
布拉德·吉尔伯特b2gills

4

J21 20字节

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

感谢@ Conor节省了一个字节。

说明

>{.,(/: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

@ ConorO'Brien谢谢
英里

3

批处理文件,77 72 63字节

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

至少就我所知,BATCH中没有直接的等效项,head或者说tailBATCH中没有等效项,所以这里有一个变通的解决方法。(在@Neil的帮助下-谢谢!)

dir命令/o-s用于排序降序的文件大小,并/b仅输出文件名。我们通过循环遍历那些FOR /FF每次都将变量设置为文件名。最后,我们仅输出带有的最后一个ECHO %F%

多亏了尼尔(Neil)并保证了没有目录,因此又节省了9个字节。


1
您的FOR变量需要两个%s才能在脚本中工作。否则,有一些打高尔夫球的技巧:1.不要@ECHO OFF在简短的脚本上使用,在@每行和之后添加a DO。2.删除之前的空格DO。3.该命令中:不需要空格和s dir
尼尔

1
@尼尔·阿克,谢谢。抱歉,自从我做PowerShell以来,已经很生锈了……谢谢!
AdmBorkBork

3

PHP, 84 62个字节

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

由于以假设当前目录中没有文件夹的方式更新了问题,因此我能够删除文件检查内容并将其删除。


这是我的旧答案:

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

这是我能做的最好的。也许有一种更好的方式我会丢失。

$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

2

Node.js(使用walk),114字节

忽略换行符:

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))

这将调用遍历当前目录(__dirname)的walker,并且对于每个文件,将调用一个带有其stat s的函数,然后n()调用另一个函数以继续遍历。然后在处end,打印出找到的文件名,该文件名的size字节数最少。s.size>m.size返回false的时候m.sizeundefined,第一回调后的话,m等于第一个文件中找到,并从那里继续正常。


2

R,36个字节

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

讲解

file.info()data.frame当给定文件/文件夹名称的字符或字符向量时,返回“文件信息”,当在当前目录(dir())的文件/文件夹列表中使用该字符或字符向量时,其外观类似于:

                                                               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

随后,我们找到了该size列(使用缩写为$s)最小的文件名。因此,如果有多个最小大小的文件,则将全部返回。

奖励:如果我们也想忽略当前目录中的文件夹,我们可以在时搜索大小isdir == FALSEx=file.info(y<-dir());y[x$s==min(x$s[!x$i])]44字节。


有点晚了,但是file.size比较短,因为您以后不需要做$s
JAD


2

SmileBASIC,110字节

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]

仅查看TXT:文件,因为DAT:除非您已经知道文件的大小,否则无法加载文件,因此无法加载随机文件。


如何加载DAT: 文件?您可以强行强制文件夹中的每个名称/文件大小吗?
Pavel

尝试将3维DAT:文件加载到2维数组中(例如)将导致错误,因此您不能强行使用它。您只需要事先知道通常需要的尺寸数即可。
17Me21年

您可以将2维DAT: 文件加载到3维数组中吗?然后,您可以创建一个最大大小的数组。而且您无法以任何方式捕获错误?
Pavel

不,这将导致类型不匹配错误。而且也没有办法捕获错误。
17Me21年


1

C#,277个字节

不是最短的,但是您对C#有什么期望?

打高尔夫球

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())]);}}

不打高尔夫球

//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())]);
    }
}

1

Röda32 31字节

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

这是一个匿名函数,该函数按文件长度对当前目录中的文件进行排序,然后使用选择第一个文件pull

像这样使用它: main{ {ls""|sort key=fileLength|pull} }


显然ls""和一样好ls"."。我认为您可以从中节省一个字节
Kritixi Lithos

@KritixiLithos似乎。谢谢!
fergusq

0

SmileBASIC 3,105个字节(有竞争力吗?)

击败12Me21的答案,但是从无法加载DAT文件仍然遭受(这感觉非常残酷的要考虑不合格的情况。)

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]

上面的简短版本很烦人,并会提示您加载每个文件,但它确实起作用。如果再增加两个字节,则可以取消提示。将第2行更改为此:

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

0

批处理文件,33个字节

这次,批处理文件具有中等竞争力,这很奇怪。

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

输出量

在此处输入图片说明


找到一种在运行q之前停止创建的方法,dir/os/b无需将输出文件放在单独的目录中,最多可以节省6个字节。

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

qdir/b/os收集文件列表之前,该文件将被创建为空文件,始终输出为最小文件(除非与另一个0字节文件捆绑在一起)。


0

C ++ 17(gcc),180个字节

#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;}

在线尝试!

需要最近实现的标准库std::filesystem


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.