디렉토리 트리 하우스를 표시하는 프로그램 작성


9

C:/stdin에서 제공하거나 파일에서 읽은 디렉토리 (예 :)가 주어지면 각 파일 / 폴더의 깊이에 따라 들여 쓰기 된 디렉토리 트리가 생성됩니다.

나는이있는 경우 C:/두 개의 폴더가 드라이브 foobar, 그리고 bar비어있는 동안이 foo포함 baz.txt입력으로 다음 실행, C:/생산을 :

C:/
    bar/
    foo/
        baz.txt

입력을 실행하는 동안 C:/foo/생성되어야

foo/
    baz.txt

이것이 codegolf이므로 가장 낮은 바이트 수가 이깁니다. 파일 확장자 (예 :) baz.txt는 선택 사항입니다. 추가 참고 사항 : 숨겨진 파일은 무시할 수 있으며 디렉토리는 실제로 존재해야하며 파일에 인쇄 할 수없는 문자 나 줄 바꿈이 포함되어 있지 않지만 인쇄 가능한 다른 모든 ASCII 문자는 괜찮습니다 (공백이있는 파일 이름을 지원해야 함). 파일 또는 stdout에 출력을 쓸 수 있습니다. 들여 쓰기는 탭 문자 또는 4 개의 공백으로 구성 될 수 있습니다.


1
추가 참고 사항 :이 질문의 형식이 잘못되었으므로 다시 포맷하는 것이 좋습니다.
Mathime

파일에 액세스 할 수없는 언어가 자동으로 실격됩니까?
Leaky Nun

어떤 파일 이름을 지원해야합니까? 이름에 공백이있는 파일? 줄 바꿈으로? 인쇄 할 수없는 문자? 숨겨진 파일은로 시작 .합니까?
손잡이

1
@LeakyNun 참조 질문의 출력은 배열의 배열입니다. 이 질문에는 디렉토리 트리를 stdout으로 인쇄해야합니다.
Mathime

1
입력 값이 함수의 문자열 매개 변수 일 수 있습니까?
mbomb007

답변:


10

bash, 61 58 54 바이트

find "$1" -exec ls -Fd {} \;|perl -pe's|.*?/(?!$)|  |g'

입력을 명령 행 인수로 사용하여 STDOUT에 출력합니다.

앞에있는 끝 근처의 공백 |g은 실제로 탭 문자입니다 (SE는 게시물을 표시 할 때 공백으로 변환 함).

find              crawl directory tree recursively
"$1"              starting at the input directory
-exec             and for each file found, execute...
ls -Fd {} \;      append a trailing slash if it's a directory (using -F of ls)
|perl -pe         pipe each line to perl
'
s|                replace...
.*?/              each parent directory in the file's path...
(?!$)             that doesn't occur at the end of the string...
|    |            with a tab character...
g                 globally
'

4 바이트의 @Dennis 에 감사 합니다!


2

Dyalog APL , 48 바이트

(⊂∘⊃,1↓'[^\\]+\\'⎕R'    ')r[⍋↑r←⎕SH'dir/s/b ',⍞]

문자 입력을위한 프롬프트

'dir/s/b ', 접두사 텍스트

⎕SH 쉘에서 실행

r←r에 저장

문자열 목록을 문자 행렬로 만들기

오름차순 정렬을위한 인덱스

r[... ]재정렬 r [정렬]

(... )쉘 명령의 표준에서 다음을 수행하십시오.

'[^\\]+\\'⎕R' ' 정규 표현식은 백 슬래시로 끝나는 비 슬래시 실행을 4 개의 공백으로 바꿉니다.

1↓ 첫 줄을 버리다

⊂∘⊃, 동봉 된 첫 줄 앞에 [line]

프롬프트에 "\ tmp"를 입력 한 결과는 내 컴퓨터에서 다음과 같이 시작됩니다.

C:\tmp\12u64
            keyboards64.msi
            netfx64.exe
            setup.exe
            setup_64_unicode.msi
            setup_dotnet_64.msi
        AdamsReg.reg
        AdamsReg.zip
        qa.dws
        ride-experimental
            win32
                d3dcompiler_47.dll
                icudtl.dat
                libEGL.dll


디렉토리에 \ 문자가 있어야합니까?
Neil


2

SML , 176 바이트

open OS.FileSys;val! =chDir;fun&n w=(print("\n"^w^n);!n;print"/";c(openDir(getDir()))(w^"\t");!"..")and c$w=case readDir$of SOME i=>(&i w handle _=>();c$w)|x=>()fun%p=(&p"";!p)

%문자열을 인수로 취하는 함수 를 선언 합니다. 현재 디렉토리 로 % "C:/Some/Path";또는 % (getDir());현재 디렉토리로 전화하십시오.

나는 FileSys이 도전을 읽은 후 발견 한-라이브러리 가있는 기능적으로 사용되는 언어 StandardML을 사용하고 있습니다 .

특수 문자는 !, &, $%언어 자체에 특별한 의미가 없으며 단순히 식별자로 사용된다; 그러나 표준 영숫자 식별자와 혼합하여 다른 필요한 공간을 제거 할 수는 없습니다.

open OS.FileSys;
val ! = chDir;                       define ! as short cut for chDir

fun & n w = (                        & is the function name
                                     n is the current file or directory name
                                     w is a string containing the tabs
    print ("\n"^w^n);                ^ concatenates strings
    ! n;                             change in the directory, this throws an 
                                     exception if n is a file name
    print "/";                       if we are here, n is a directory so print a /
    c (openDir(getDir())) (w^"\t");  call c with new directory and add a tab to w
                                     to print the contents of the directory n
    ! ".."                           we're finished with n so go up again
)
and c $ w =                          'and' instead of 'fun' must be used 
                                     because '&' and 'c' are mutual recursive
                                     $ is a stream of the directory content
    case readDir $ of                case distinction whether any files are left
        SOME i => (                  yes, i is the file or directory name
            & i w handle _ => ();    call & to print i an check whether it's a 
                                     directory or not, handle the thrown exception 
            c $ w )                  recursively call c to check for more files in $
        | x    => ()                 no more files, we are finished

fun % p = (                          % is the function name, 
                                     p is a string containing the path
    & p "";                          call & to print the directory specified by p
                                     and recursively it's sub-directories
    ! p                              change back to path p due to the ! ".." in &
)

SML / NJ 또는 접두사로 모스크바 ML *을 사용하여 이와 같이 컴파일 할 수 있습니다 load"OS";.

*를 참조하십시오 mosml.org. 링크를 2 개 이상 게시 할 수 없습니다.


1

C # (. NET 코어) , 222 바이트

namespace System.IO{class P{static int n;static void Main(String[]a){Console.WriteLine(new string('\t',n++)+Path.GetFileName(a[0]));try{foreach(var f in Directory.GetFileSystemEntries(a[0])){a[0]=f;Main(a);}}catch{}n--;}}}

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


언 골프 :

using System.IO;
using System;

class P
{
    static int n=0;
    static void Main(String[] a)
    {
        for (int i=0;i<n;i++) Console.Write("\t");
        Console.WriteLine(Path.GetFileName(a[0]));
        n++;

        if(Directory.Exists(a[0]))
            foreach (String f in Directory.GetFileSystemEntries(a[0]))
                Main(new String[]{f});
        n--;
    }
}

처음으로 Main기능을 되풀이했습니다 !

나는 C #에 대해 더 신선한 지식을 가진 사람이 C #을 한동안 프로그래밍하지 않았기 때문에 더 골프를 질 수 있다고 생각합니다!


0

PHP, 180 바이트

  • 첫 번째 인수 : 경로에는 슬래시 (또는 백 슬래시)가 있어야합니다.
  • 두 번째 주장 : 수준은 기본적으로 다음 NULL과 같이 해석 0됩니다 str_repeat. 제공하지 않으면 경고를 던집니다

function d($p,$e){$s=opendir($p);echo$b=str_repeat("\t",$e++),$e?basename($p)."/":$p,"
";while($f=readdir($s))echo preg_match("#^\.#",$f)?"":is_dir($p.$f)?d("$p$f/",$e):"$b\t$f
";}
  • 디스플레이 숨겨진 파일과 디렉토리 만 같이 Recurse 숨겨진 디렉토리가없는
    괄호 추가 is_dir(...)?d(...):"..."출력 (+2)에서 숨겨진 항목을 제거 할 수는
    교체 "#^\.#"#^\.+$#(+2) / 디스플레이 숨겨진 항목을 재귀하지만 항목을 점 건너 뛰기
  • 디렉토리가 너무 깊게 중첩되면 오류가 발생할 수 있습니다. closedir($s);최종 }수정 전에 삽입 (+13)
  • 디렉토리에 이름이없는 항목이 포함 된 경우 실패 할 것입니다 false!==(+8).

glob, 182 바이트 (미래 PHP에서 아마도 163)

function g($p,$e){echo$b=str_repeat("\t",$e),$e++?basename($p)."/":$p,"
";foreach(glob(preg_replace("#[*?[]#","[$1]",$p)."*",2)as$f)echo is_dir($f)?g($f,$e):"$b\t".basename($f)."
";}
  • 숨겨진 파일 / 디렉토리를 표시하거나 재귀하지 않습니다
  • 2의미 GLOB_MARK처럼, 모든 디렉토리 이름에 슬래시를 추가합니다,ls -F
  • preg_replace탈출 글로브 특수 문자는
    내가 학대 있었다 preg_quote(-19)이 대한; 그러나 백 슬래시는 디렉토리 구분 기호이므로 Windows 시스템에서는 실패합니다.
  • php glob_quote 함수를 포함 할 수 있습니다.이 함수 preg_quote는 모든 시스템 에서 동일한 골프를 치고 작동 할 것입니다.

반복자, 183 바이트
(순수하게 반복자가 아님) : SplFileInfo::__toString()골프 $f->getBaseName()$f->isDir()이전 PHP 4 함수에 암시 적을 사용했습니다 .

function i($p){echo"$p
";foreach($i=new RecursiveIteratorIterator(new RecursiveDirectoryIterator($p),1)as$f)echo str_repeat("\t",1+$i->getDepth()),basename($f),is_dir($f)?"/":"","
";}
  • 후행 슬래시 필요 없음
  • 숨겨진 항목 표시 및 재귀 ( ls -a)
  • 삽입 ,4096하거나 건너 뛰기 ,FilesystemIterator::SKIP_DOTS전에 ),1점 항목 건너 뛰기 (+5) ( ls -A)
  • 깃발의 1약자RecursiveIteratorIterator::SELF_FIRST

0

PowerShell, 147 바이트

param($a)function z{param($n,$d)ls $n.fullname|%{$f=$_.mode[0]-ne"d";Write-Host(" "*$d*4)"$($_.name)$(("\")[$f])";If(!$f){z $_($d+1)}}}$a;z(gi $a)1

남자, 나는 PS가 bash 답변과 같은 것을 할 수 있어야한다고 생각하지만, 내가 여기있는 것보다 짧은 것을 내놓지 않을 것입니다.

설명:

param($a)                     # assign first passed parameter to $a
function z{param($n,$d) ... } # declare function z with $n and $d as parameters
ls $n.fullname                # list out contents of directory
|%{ ... }                     # foreach
$f=$_.namde[0]-ne"d"          # if current item is a file, $f=true
Write-Host                    # writes output to the console
(" "*$d*4)                    # multiplies a space by the depth ($d) and 4
"$($_.name)$(("\")[$f])"      # item name + the trailing slash if it is a directory
;if(!$f){z $_($d+1)}          # if it is a directory, recursively call z
$a                            # write first directory to console
z(gi $a)1                     # call z with $a as a directoryinfo object and 1 as the starting depth

0

파이썬 2, 138 바이트

이 SO 답변 에서 수정되었습니다 . 그것들은 공백이 아닌 들여 쓰기를위한 탭입니다. 입력은 다음과 같습니다 "C:/".

import os
p=input()
for r,d,f in os.walk(p):
    t=r.replace(p,'').count('/');print' '*t+os.path.basename(r)
    for i in f:print'   '*-~t+i

온라인으로보십시오 - 그것은 내가 Ideone에 디렉토리를 검색 할 수있어 꽤 흥미 롭군요 ...

같은 길이 :

from os import*
p=input()
for r,d,f in walk(p):
    t=r.replace(p,'').count(sep);print' '*t+path.basename(r)
    for i in f:print'   '*-~t+i

0

배치, 237 바이트

@echo off
echo %~1\
for /f %%d in ('dir/s/b %1')do call:f %1 %%~ad "%%d"
exit/b
:f
set f=%~3
call set f=%%f:~1=%%
set i=
:l
set i=\t%i%
set f=%f:*\=%
if not %f%==%f:*\=% goto l
set a=%2
if %a:~0,1%==d set f=%f%\
echo %i%%f%

여기서 \ t는 리터럴 탭 문자를 나타냅니다. 이 버전에는 \디렉토리에 후행이 포함되어 있지만 필요하지 않은 경우 41 바이트를 저장할 수 있습니다.


후행`\`은 필요하지 않습니다
ASCII 전용

0

펄, 89 바이트

핵심 배포판에 찾기 모듈이있을 때 유용합니다. Perl의 File :: Find 모듈은 알파벳순으로 트리를 순회하지 않지만 사양에서는 요구하지 않았습니다.

/usr/bin/perl -MFile::Find -nE 'chop;find{postprocess,sub{--$d},wanted,sub{say" "x$d.$_,-d$_&&++$d&&"/"}},$_'

적절한 스크립트는 76 바이트이며 명령 행 옵션으로 13 바이트를 계산했습니다.



0

자바 8, 205 바이트

import java.io.*;public interface M{static void p(File f,String p){System.out.println(p+f.getName());if(!f.isFile())for(File c:f.listFiles())p(c,p+"\t");}static void main(String[]a){p(new File(a[0]),"");}}

이것은 첫 번째 명령 줄 인수 (명시 적으로 허용되지는 않지만 다른 많은 사람들이 수행)에서 입력을 받아 출력을 표준 출력으로 인쇄하는 전체 프로그램 제출입니다.

온라인으로 시도 (다른 인터페이스 이름 참고)

언 골프

import java.io.*;

public interface M {
    static void p(File f, String p) {
        System.out.println(p + f.getName());
        if (!f.isFile())
            for (File c : f.listFiles())
                p(c, p + "\t");
    }

    static void main(String[] a) {
        p(new File(a[0]), "");
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.