ডিরেক্টরি ট্রি হাউস প্রদর্শনের জন্য একটি প্রোগ্রাম লিখুন


9

C:/স্টিডিন থেকে দেওয়া বা ফাইল থেকে পড়া একটি ডিরেক্টরি দেওয়া (যেমন ) প্রতিটি ডিরেক্টরি / ফাইলের গভীরতার উপর ভিত্তি করে ইন্টেন্ট করে একটি ডিরেক্টরি ট্রি তৈরি করে।

উদাহরণ

আমি যদি C:/ড্রাইভ যা শুধুমাত্র দুই ফোল্ডার রয়েছে fooএবং barআর barখালি যখন fooধারণ করে baz.txt, তারপর চলমান ইনপুট দিয়ে C:/উৎপন্ন:

C:/
    bar/
    foo/
        baz.txt

ইনপুট দিয়ে চলার সময় C:/foo/উত্পাদন করা উচিত

foo/
    baz.txt

যেহেতু এটি কোডগল্ফ, সর্বনিম্ন বাইট গণনা জয়। ফাইল এক্সটেনশনগুলি (যেমন baz.txt) alচ্ছিক। অতিরিক্ত নোট: লুকানো ফাইলগুলি উপেক্ষা করা যেতে পারে, ডিরেক্টরিগুলি অবশ্যই বিদ্যমান থাকতে পারে, এটি ধরে নেওয়া যেতে পারে যে ফাইলগুলিতে অপ্রিন্টযোগ্য অক্ষর বা নতুন লাইন থাকে না তবে অন্য সমস্ত মুদ্রণযোগ্য ASCII অক্ষর ভাল হয় (স্পেস সহ ফাইলের নামগুলি সমর্থন করা আবশ্যক)। আউটপুট ফাইল বা stdout লিখিত যেতে পারে। ইনডেন্টেশনগুলি কোনও ট্যাব অক্ষর বা 4 টি স্পেস দিয়ে তৈরি করা যেতে পারে।


1
অতিরিক্ত দ্রষ্টব্য: এই প্রশ্নটি খারাপভাবে ফর্ম্যাট করা হয়েছে, সুতরাং একটি পুনর্নির্মাণ প্রশংসা করা হবে।
ম্যাথিম

যে ভাষাগুলিতে ফাইলে অ্যাক্সেস নেই সেগুলি কি স্বয়ংক্রিয়ভাবে অযোগ্য ঘোষণা করে?
ফাঁস নুন

কোন ফাইলের নামগুলি সমর্থন করতে হবে? তাদের নামে ফাঁকা ফাইল আছে? নতুন লাইনের সাথে? মুদ্রণযোগ্য অক্ষরের সাথে? লুকানো ফাইলগুলি (শুরু দিয়ে .) কী হবে?
ডুরকনব

1
@ লিকিউন রেফারেন্স প্রশ্নের আউটপুট অ্যারে একটি অ্যারে। এই প্রশ্নের জন্য স্টাডাউটে মুদ্রণ করতে ডিরেক্টরি ট্রিটির উপস্থাপনা প্রয়োজন।
ম্যাথিম

1
ইনপুট কি কোনও ফাংশনের স্ট্রিং প্যারামিটার হতে পারে?
mbomb007

উত্তর:


10

বাশ, 61 58 54 বাইট

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

কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট নেয়, STDOUT এ আউটপুট দেয়।

মনে রাখবেন যে শেষের কাছাকাছি স্পেসগুলি |gআসলে একটি ট্যাব অক্ষর (এসই পোস্টগুলি প্রদর্শন করার সময় স্পেসে রূপান্তরিত করে)।

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 বাইটের জন্য ধন্যবাদ !


2

ডায়ালগ এপিএল , 48 বাইট

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

অক্ষর ইনপুট জন্য প্রম্পট

'dir/s/b ', পাঠ্য প্রিপেন্ড করুন

⎕SH শেল চালিত

r←r এ স্টোর

অক্ষর ম্যাট্রিক্সে স্ট্রিংগুলির তালিকা তৈরি করুন

আরোহী বাছাইয়ের জন্য সূচকগুলি

r[... ]পুনরায় অর্ডার করুন [সাজানো]

(... )শেল কমান্ডের বাইরে স্ট্যান্ডার্ডে, করুন:

'[^\\]+\\'⎕R' ' regex চারটি স্পেস দ্বারা ব্যাকস্ল্যাশ-অবহিত রানগুলি প্রতিস্থাপন করে না las

1↓ প্রথম লাইন ড্রপ

⊂∘⊃, বদ্ধ প্রথম [লাইন] পূর্বে

প্রম্পটে "mp 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


ডিরেক্টরিগুলি কি iling টি অক্ষর রাখার কথা?
নিল


2

এসএমএল , 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এমএমএল ব্যবহার করছি যার -জীবন আমি এই চ্যালেঞ্জটি পড়ার পরে আবিষ্কার করেছি।

বিশেষ অক্ষর !, &, $এবং %নিজেই ভাষায় কোন বিশেষ অর্থ আছে কেবল শনাক্তকারী হিসেবে ব্যবহার করা হয়; তবে এগুলিকে স্ট্যান্ডার্ড আলফানিউমেরিক আইডেন্টিফায়ারগুলির সাথে মিশ্রিত করা যাবে না যা অন্যথায় প্রয়োজনীয় কিছু স্থান থেকে মুক্তি পেতে দেয়।

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

এসএমএল / এনজে বা মস্কো এমএল * এর সাথে উপসর্গ রেখে এরকম সংকলন করা যায় load"OS";

* দেখুন mosml.org, 2 টির বেশি লিঙ্ক পোস্ট করতে পারবেন না।


1

সি # (.নেট কোর) , 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ফাংশন পুনরাবৃত্তি করেছি !

আমি বিশ্বাস করি যে সি # এর আরও নূতন জ্ঞান রয়েছে এমন ব্যক্তি এটি আরও গল্ফ করতে পারেন, কারণ আমি কিছু সময়ের জন্য সি # তে প্রোগ্রাম করিনি!


0

পিএইচপি, 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) থেকে লুকানো এন্ট্রি মুছে ফেলার জন্য
    প্রতিস্থাপন "#^\.#"সঙ্গে #^\.+$#/ প্রদর্শনে গোপন এন্ট্রি recurse কিন্তু এন্ট্রি ডট লাফালাফি (+2)
  • ডিরেক্টরিগুলি খুব গভীরভাবে বাসা বাঁধলে ত্রুটি ফেলে দিতে পারে। ঢোকান closedir($s);ফাইনালের আগে }ফিক্স করার জন্য (+13)
  • কোনও ডিরেক্টরিতে কোনও নাম ছাড়া কোনও ডিরেক্টরিতে কোনও এন্ট্রি থাকলে ব্যর্থ হয়ে যাবে false!==(+8)

গ্লোব সহ, 182 বাইট (ভবিষ্যতে পিএইচপি সম্ভবত 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বেরিয়ে উল্লিখিত glob বিশেষ অক্ষর
    আমি নির্যাতিত পারতেন preg_quote(-19) এই জন্য; তবে এটি উইন্ডোজ সিস্টেমগুলিতে ব্যর্থ হবে, কারণ ব্যাকস্ল্যাশ সেখানে ডিরেক্টরি বিভাজক।
  • পিএইচপি শীঘ্রই গ্লোব_কোটের একটি ফাংশন অন্তর্ভুক্ত করতে পারে , যা একই গল্ফিংকেpreg_quote সমস্ত সিস্টেমে কাজ করার অনুমতি দেয় ।

পুনরাবৃত্তকারী, 183 বাইট
(ভাল, খাঁটি পুনরাবৃত্তকারী নয়: আমি SplFileInfo::__toString()গল্ফ $f->getBaseName()এবং $f->isDir()পুরাতন পিএইচপি 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)
  • ডট এন্ট্রিগুলি (+5) ( ) প্রবেশ করান ,4096বা তার ,FilesystemIterator::SKIP_DOTSআগে প্রবেশ করুন),1ls -A
  • পতাকা 1দাঁড়িয়েছেRecursiveIteratorIterator::SELF_FIRST

0

পাওয়ারশেল, 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

মানুষ, আমার মনে হচ্ছে পিএস বাশ উত্তরের মতো কিছু করতে সক্ষম হবে তবে আমি যা পেয়েছি তার চেয়ে ছোট কিছু নিয়ে আসছি না।

ব্যাখ্যা:

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 বাইট

এই এসও উত্তর থেকে পরিবর্তিত । সেগুলি ফাঁকা স্থান নয়, প্রবর্তনের জন্য ট্যাব are ইনপুট যেমন নেওয়া হবে "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

এটি অনলাইনে চেষ্টা করে দেখুন - এটি বেশ আকর্ষণীয় যে আমাকে আইডিয়নে ডিরেক্টরি ব্রাউজ করার অনুমতি দেওয়া ...

একই দৈর্ঘ্য:

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 বাইটগুলি সেভ করা যায় না যদি সেগুলির প্রয়োজন হয় না।


চলার n't \ `` s এর দরকার নেই
ASCII-

0

পার্ল, 89 বাইট

মূল বিতরণে কোনও সন্ধানের মডিউল থাকলে এটি কার্যকর। পার্লের ফাইল :: সন্ধান করুন মডিউলটি বর্ণমালা অনুসারে গাছটিকে অতিক্রম করে না, তবে অনুমানটি এটির জন্য জিজ্ঞাসা করেনি।

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

এটি একটি সম্পূর্ণ প্রোগ্রাম জমা দেওয়া যা তার প্রথম কমান্ড-লাইন আর্গুমেন্ট থেকে ইনপুট নেয় (স্পষ্টভাবে অনুমোদিত নয়, তবে অন্য অনেকের দ্বারা সম্পন্ন হয়) এবং আউটপুটটিকে স্ট্যান্ডার্ড আউট প্রিন্ট করে।

এটি অনলাইনে চেষ্টা করুন (বিভিন্ন ইন্টারফেসের নামটি নোট করুন)

Ungolfed

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.