2014-11-25 2 views
-4

нужно Баш скрипт для отображения файловBash скрипт Shell Script

#!/bin/bash 

my_ls() { 
    # save current directory then cd to "$1" 
    pushd "$1" >/dev/null 
    # for each non-hidden (i.e. not starting with .) file/directory... 
    for file in * ; do 
    # print file/direcotry name if it really exists... 
    test -e "$file" && echo "$2$file" 
    # if directory, go down and list directory contents too 
    test -d "$file" && my_ls "$file" "$2 " 
    done 
    # restore directory 
    popd >/dev/null 
} 

my_ls 

ожидается выход:

file1 
file2 
info (directory) 
    data 
    stuff (directory) 
     input 
    output 
    scripts (directory) 
    doit 
     helper 
    testinput 
jobs 
results (directory) 
    bob 
    dave 
    mary 
+1

Я предлагаю использовать команду 'find' и переформатировать ее выход. – Jdamian

+0

@Jdamian это именно то, что мне нужно – user4186509

+0

file1, file2, задания - это только файлы, нам нужно отобразить (каталог под каталогами) – user4186509

ответ

1

Вот Баш скрипт, который делает то, что вы спрашиваете.

$ cat tree 
#!/bin/bash 
# tree [DIR] 

ls_tree() { 
    dir="${1:-.}" 
    while read name ; do 
    if [[ -n "$name" ]]; then 
     if [[ "$name" =~ :$ ]]; then 
     dir="${name%:}" 
     else 
     echo "$dir/${name%*}" 
     fi 
    fi 
    done 
} 

show_tree() { 
    sed -e 's|^./||' | sort | sed -e 's|/$||' -e 's|[^/]*/| |g' 
} 


/bin/ls -1RF "${1:-.}" | ls_tree "${1:-.}" | show_tree 

Вот пример вывода:

$ tree 
fun.rb 
fun 
    data 
    filter.awk 
    good 
    inputtest.sh 
    reqs 
    test1.awk 
input 
pairs 
    pairs.sh 
split-collections 
    indir 
     col1 
     col2 
     col3 
    outdir 
     file1 
     file2 
     file21 
     file22 
     file23 
     file3 
     file31 
     file32 
     file33 
    split-collections.sh 
    t1 
tree1 
+0

как я могу (каталог) напечатать перед каталогом? – user4186509

+0

как я могу добавить каталог перед каталогом? – user4186509

+0

Где я должен добавить (каталог)? – user4186509

0

Это основное решение одной строки:

find . -type d -printf '%p (directory)\n' -o -print | LC_ALL=C sort | sed 's:[^/]*/: :g' 

Это тот же самый код, разделение на несколько строк для удобства чтения:

find . -type d -printf '%p (directory)\n' -o -print | 
LC_ALL=C sort | 
sed 's:[^/]*/: :g' 

LC_ALL=C заключается в том, чтобы предотвратить sort, делая странные вещи в зависимости от локали. Существует множество решений таких проблем, как этот в Интернете. Попробуйте искать find sed tree. Первый удар - вопрос StackOverflow: Tree functionality using sed and find command.

Обратите внимание, что это решение не будет работать на Mac OS, потому что его «find» является старым, который не поддерживает параметр «-printf».

+0

@ user4186509, я тестировал однострочный (вырезанный и вставленный со страницы Stackoverflow) несколько систем и не видел очевидных проблем. Какие проблемы вы видите? Вы получаете сообщение об ошибке, или результат не тот, который вы ожидаете? – pjh

+0

@ user4186509, я подозреваю, что у вас есть ошибка разреза и вставки. Все кавычки в коде совпадают. Возможно, некоторые персонажи потерялись в конце длинной линии. Я добавил многострочную версию ответа, поэтому, возможно, попробуйте использовать это вместо этого. – pjh

+0

@ user4186509, я изменил ответ, чтобы сказать, что он не работает в Mac OS. У вопроса есть тег 'linux', поэтому я предположил, что решение linux-only будет приемлемым.Он может быть изменен для работы в Mac OS, но получение строки '(directory)' на выходе будет беспорядочным. – pjh

Смежные вопросы