가장 작은 파일 찾기


19

골:

현재 폴더에서 가장 작은 파일을 찾을 수있는 프로그램을 만듭니다.

  • 파일 크기는 바이트 또는 문자로 측정 할 수 있습니다.
  • 여러 파일의 크기가 같은 경우 하나를 선택하거나 모두 표시 할 수 있습니다.
  • 폴더에 파일이 하나 이상 있다고 가정 할 수 있으며 크기가 0 인 파일은 없습니다.
  • 폴더의 모든 파일을 사용중인 언어로로드 할 수 있다고 가정하십시오.

  • 현재 디렉토리에 폴더가 없다고 가정하십시오.

입력:

다음과 같은 경우를 제외하고 프로그램은 사용자의 입력을받지 않아야합니다.

  • 언어에 "현재 폴더"가 없으면 사용자에게 폴더 이름 / 경로를 요청할 수 있습니다.
  • 언어가 컴퓨터의 파일에 직접 액세스 할 수없는 경우 사용자가 파일을 업로드 할 수 있습니다. (예를 들어, 자바 스크립트)

산출:

가장 작은 파일의 이름이 표시되어야합니다.

  • 어떤 파일을 선택했는지 분명한 경우 선행 / 후행 기호가 허용됩니다.
  • (모든 파일의 목록을 인쇄하는 것은 규칙에 위배됩니다).

노트:

  • 표준 허점 은 허용되지 않습니다.
  • 폴더의 파일을 수정 / 생성 / 삭제하여 결과를 변경할 수 없습니다.
  • 이것은 . 최단 답변 (바이트)이 이깁니다.

1
파일 크기가 0 일 있다고 가정 할 수 있습니까 ?
Rɪᴋᴇʀ

또한 "폴더의 모든 파일에 액세스 할 수 있다고 가정"한다는 것은 무엇을 의미합니까? 숨겨진 파일을 표시 할 필요가 없다는 의미입니까?
Rɪᴋᴇʀ

2
현재 폴더에 폴더가 없다고 가정 할 수 있습니까? 파일 대신 파일과 폴더를 모두 반환하는 언어 함수가 있으면 모든 차이가 있습니다!
sergiol

1
반드시 그런 것은 아닙니다. 현재 디렉토리 내에 디렉토리가없고 모호하지 않으며 응답을 무효화하지 않는다고 가정 할 수 있습니다 .
Dennis

1
(죄송합니다. 더 빨리 응답하지 않았습니다. 인터넷 연결이 며칠 동안 끊겼습니다.) 숨겨진 파일을 건너 뛸 수있게하는 데 따르는 문제는 많은 허점을 여는 것 같습니다. "약간 액세스하기 어려운"파일을 건너 뛰도록 허용하면 사람들은 몇 바이트를 절약하기 때문에 처음 9 개 파일 만 검사하는 것과 같은 작업을 수행 할 수 있습니다.
12Me21

답변:


7

Vim 12 바이트

!!ls -Sa
Gd{

온라인으로 사용해보십시오!

설명:

!!는 IS 필터 명령. 현재 행의 내용을 임의의 시스템 명령으로 파이프하고 출력을 다시 버퍼로 보냅니다. !!rev현재 줄 !Gxxd을 바꾸거나 버퍼를 hexdump하는 것과 같이 bash가 vim보다 나은 것에 외부 도구를 사용하는 데 유용합니다 . 우리의 경우, 버퍼는 비어 있으므로 이는 :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 -13 바이트가 짧고 출력이 더 깨끗합니다.
orlp

@orlp thanks! ..
Rɪᴋᴇʀ

1
나는 당신이 '-1'을 필요로하지 않는다고 생각합니다. 파이프는 자동으로 한 줄에 하나의 파일을 넣습니다.
GB

@EasterlyIrk GB가 옳다고 생각합니다. 만약 ls검출 출력 단자이고 그것은 여러 열로 출력을 포맷한다. 그러나 출력이 파이프이면 한 줄에 1을 수행합니다. 비교 lsls|cat
디지털 외상

2 바이트 더 짧음 :ls -Sar|sed q
Digital Trauma

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

"."기본값이 2이므로 Python 3으로 이동하는 2 바이트를 저장하십시오 . print(min(filter(path.isfile,listdir()),key=path.getsize))
Jonathan Allan

또한 나는 76 없다 77 셀
조나단 앨런

@JonathanAllan 나는 측정 된 바이트 수를 카운트 wc1 바이트 더 내게 준
OVS

불필요한 바이트는 후행 줄 바꿈으로 인한 것이며, 파이썬에는 필요하지 않습니다. 또한 하위 디렉터리가 없음을 filter알리기 위해 문제가 업데이트 되었으므로 전체 비트가 필요하지 않습니다 . print함수 이므로 파이썬 3에서도 작동하지 않습니다 . 다음은 효과가 있고 훨씬 짧습니다.print(min(listdir(),key=path.getsize))
Mego

8

PowerShell , 30 24 21 바이트

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

온라인으로 사용해보십시오!

ls의 별칭입니다 Get-ChildItem. 속성 sort-object과 함께 파이프 length되므로 파일이 크기별로 정렬됩니다. 우리는 그것으로 색인을 작성 (...)[0]하여 첫 번째 (즉, 가장 작은)를 얻은 다음 가져옵니다 .Name. 암시 적 출력 Write-Output은 프로그램 완료시 발생합니다.

디렉토리에 파일 만 존재한다는 것이 보장되어 6 바이트가 절약되었습니다. ConnorLSW 덕분에 추가로 3을 절약했습니다.


2
-file파일 만 현재 디렉토리에 있으므로 파일을 제거 할 수 없습니까 ?
Mutantoe 2012 년

@Mutantoe 예-이 답변을 게시 한 후에 도전 과제로 편집되었습니다. 감사!
AdmBorkBork

sort le*powershell에서 허용하므로 일부 바이트를 면도 하는 데 사용할 수 있습니다 .
colsw

@ConnorLSW 물론입니다. 감사!
AdmBorkBork

7

루비, 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[?*]훨씬 짧지 만 .bash_profile... 같은 숨겨진 유닉스 파일은 포함되어 있지 않기 때문 입니다 .
Value Ink

아마 Dir [? *, ".? *"]가 작동했을 수도 있습니다. 시도하지 않았습니다. 그리고 더 짧습니다.
GB

@GB 실제로는 Dir[?*,".*"]입니다. 전역 문자열 .?*은 파일이 .a있으면 일치하지 않습니다 .
Value Ink

6

Mathematica, 35 바이트

FileNames[]~MinimalBy~FileByteCount

FileNames[]현재 디렉토리에있는 모든 파일 (및 디렉토리)의 이름 목록을 생성합니다. ~MinimalBy~FileByteCount바이트 수가 가장 작은 파일 이름을 선택합니다. FileByteCount디렉토리에 적용될 때 많은 오류가 발생하지만 오류는 프로그램을 손상시키지 않습니다.


6

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

온라인으로 사용해보십시오!

CAD97 덕분에 -7 바이트


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

@ CAD97 당신이 맞아요! 내가 생각한 것은 ...
Poke

6

SH (Linux / Unix) 15 14 13 14 바이트

ls -aS|tail -1

-S 크기 (내림차순)로 정렬

-r반전tail -1출력 목록의 마지막 파일.

@ Dennis 1 바이트를 저장해 주셔서 감사합니다 @Dani_l 1 바이트를 저장해 주셔서 감사합니다.


가장 큰 파일을 찾 습니까?
Dennis

신경 쓰지 마, 피곤해 tail반전 대신 사용할 수 -1있으며의 약어입니다 -n1.
Dennis

@Dennis 업데이트
Abel Tom

@EasterlyIrk 이제 그것은 :)
Abel Tom

@AbelTom 쿨, 수정 주셔서 감사합니다.
Rɪᴋᴇʀ

4

MATLAB / 옥타브, 52 48 바이트

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

설명

이것은 현재 디렉토리의 모든 파일과 폴더의 디렉토리 목록을 가져옵니다. dir . 의 출력은 dirA가 struct이 등 디렉토리 여부, 크기 (바이트)인지, 파일 이름을 포함

우리는 바이트 단위로 각각의 크기의 배열을 취할 수 있습니다 [d.bytes] 디렉토리인지 여부를 나타내는 부울로 요소 단위 구분을 수행 ~[d.isdir]할 수 있습니다 Inf(디렉토리가 0 인 경우). 1).

우리는 두 번째 출력을 사용 하여이 배열의 최소 인덱스를 찾고 min초기 구조체에 색인을 생성하고 이름을 표시하는 데 사용합니다.d(n).name


disp(...)출력물을 추가 하여 올바르게 인쇄해야합니다. 그렇지 않으면 예를 들어 ans폴더에서 가장 작은 파일이없는 경우 MATLAB에 익숙하지 않은 사람에게는 어떤 파일이 가장 작은 지 출력이 명확하지 않습니다.
Tom Carpenter

@TomCarpenter 흠 나는이 있음을 의미하는 "기호는 한이 파일이 선택되어있는 분명으로, 허용되는 후행 / 선도"해석 ans = 괜찮
Suever

MATLAB이 암시 적 .(현재 폴더) 및 ..(위의 폴더)를 추가한다는 것을 깨달았 으므로 디렉토리 확인을 제거 할 수 없습니다. 미안합니다.
톰 카펜터

4

스칼라, 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

apply (0) 대신 head를 사용하는 것이 더 짧습니다. 또한 File의 toString 메소드는 괜찮으므로 get name을 호출 할 필요가 없습니다.
jaxad0127

4

배치, 43 39 35 바이트

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

출력에는 어떤 이유로 선행 공간이 포함되지만 다행히도 허용됩니다. 편집 : 이제 4 바이트를 저장할 디렉토리가 없다고 가정합니다.


오, 그런 식으로 / p를 사용하면 영리합니다!
AdmBorkBork

@AdmBorkBork 아, 나는 그것이 허용되는 것을 보지 못했습니다, 감사합니다!
Neil

하위 디렉토리가 존재하지 않음 (챌린지가 업데이트 됨)을 보장하므로을 (를) 제거 할 수 있습니다 /a-d.
AdmBorkBork

4

펄 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

J , 21 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%

적어도 내 지식 과 직접적으로 동일 head하거나 tailBATCH에는 없으므로 다음과 같은 해결 방법이 있습니다. (@Neil의 많은 도움으로-감사합니다!)

내림차순으로 파일 크기를 정렬 하고 파일 이름 만 출력 하는 dir명령 입니다. 우리는 매번 변수 를 파일 이름으로 설정 하여을 사용하여 반복 합니다. 마지막으로로 마지막을 출력합니다 ./o-s/bFOR /FFECHO %F%

Neil 덕분에 9 바이트를 더 절약했으며 디렉토리가 없음을 보장했습니다.


1
귀하의 FOR변수이 개 필요 %스크립트에서 작업에들. 그렇지 않으면 몇 가지 골프 트릭이 있습니다. 1. @ECHO OFF짧은 스크립트 에는 사용하지 말고 @각 줄과 뒤에을 추가하십시오 DO. 2. 전에 공백을 삭제하십시오 DO. 3. 명령 :에 공백과 s가 필요하지 않습니다 dir.
Neil

1
@Neil Ack, 감사합니다. 죄송합니다. 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) 를 가로 지르는 워커를 호출하고 각 파일에 대해 해당 통계 s와 함게 함수를 호출하고 다음 n()에 순회를 계속하기 위해 호출해야하는 함수를 호출합니다. 그런 다음에서 end최소 size바이트를 찾은 파일 이름을 인쇄합니다 . s.size>m.size리턴 falsem.size이고 undefined, 상기 제 1 콜 이후, 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 == FALSE: x=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

DAT:예를 들어 3 차원 파일을 2 차원 배열 에로드하려고 하면 오류가 발생하므로 강제로 실행할 수 없습니다. 당신은 일반적으로 할 수있는 차원의 수를 미리 알아야합니다.
12Me21

2 차원 DAT: 파일을 3 차원 배열로 로드 할 수 있습니까? 그런 다음 최대 크기 배열을 만들 수 있습니다. 어떤 식 으로든 오류를 잡을 수 없습니까?
Pavel

아니요, 유형 불일치 오류가 발생합니다. 그리고 오류를 잡을 방법도 없습니다.
12Me21


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

로다 , 32 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 바이트 이상에서는 프롬프트를 표시하지 않을 수 있습니다. 2 행을 다음과 같이 변경하십시오.

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

0

배치 파일, 33 바이트

배치 파일은 이번에는 적당히 경쟁적입니다.

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

산출

enter image description here


실행 q하기 전에 작성을 중지하는 방법을 dir/os/b찾으면 별도의 디렉토리에 출력 파일을 넣지 않아도 최대 6 바이트를 절약 할 수 있습니다.

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

q파일 dir/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합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.