2012-05-14 4 views
2

Я хотел бы знать, как перечислить каталог в этом формате. нормальная структура списка:ShellScript - справочные файлы и подкаталоги

#find . -follow -type f | sed "s/.//" 

/files/test1/test2/file1.txt 
/files/test1/test2/file2.txt 
/files/test1/test2/file3.txt 
/files/test1/file1.txt 
/files/test1/file2.txt 
/files/test1/file3.txt 
/files/file1.txt 
/files/file2.txt 
/files/file3.txt 
/file1.txt 
/file2.txt 
/file3.txt 

Я хотел я бы перечислить следующим образом:

/files/test1/test2/file1.txt 
file2.txt 
file3.txt 
/files/test1/file1.txt 
file2.txt 
file3.txt 
/files/file1.txt 
file2.txt 
file3.txt 
/file1.txt 
file2.txt 
file3.txt 

так:

ls -R1 | sed -e 's/://' -e 's/.//' 

но хотелось бы пояснялось выше структура!

+2

'man tree' ..... –

+0

внимательно посмотрите, как я желаю! посмотрите на первую строку каждого! –

ответ

3
... | while read path; do 
    dir=$(dirname "$path") 
    if [[ $dir = $prev ]]; then 
     echo $(basename "$path") 
    else 
     echo $path 
     prev=$dir 
    fi 
done 
+0

Посмотрите на модель выше! хочу перечислить файлы, а не каталоги! –

+0

Вы попробовали? Как он не может обеспечить желаемый результат? –

1

Интересная викторина!

установки образца каталоги и файлы

mkdir -p files/test1/test2 && for P in . files files/test1 files/test1/test2; do touch "$P"/file{1,2,3}.txt; done

Как однострочника, попробуйте

find . -type d | sort -r | while read P; do printf "${P#.*}"/; ls -v | while read F; do echo ${F##*/}; done; done

Выход, как ваш запрос

/files/test1/test2/file1.txt 
file2.txt 
file3.txt 

/files/test1/file1.txt 
file2.txt 
file3.txt 

/files/file1.txt 
file2.txt 
file3.txt 

/file1.txt 
file2.txt 
file3.txt 

много удовольствия для решения этого.

+0

не работает! он повторяет первые 3 файла. для проверки, изменения имен файлов в подкаталогах! –

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