Рекурсивно перечислить все каталоги и файлы - PullRequest
43 голосов
/ 14 апреля 2009

Я хотел бы получить следующий вывод.

Предположим, структура каталогов в файловой системе выглядит следующим образом:

  -dir1
      -dir2
        -file1
        -file2
             -dir3
                -file3
                -file4
            -dir4
                -file5
       -dir5
             -dir6
             -dir7

Выходные данные из сценария должны быть такими:

Каталоги:

/dir1
/dir1/dir2
/dir1/dir2/dir3
/dir1/dir2/dir4
/dir1/dir5
/dir1/dir5/dir6
/dir1/dir5/dir7

Файлы:

/dir1
/dir1/dir2/file1
/dir1/dir2/file2
/dir1/dir2/dir3/file3
/dir1/dir2/dir3/file4
/dir1/dir2/dir4/file5
/dir1/dir5/dir6
/dir1/dir5/dir7

Не могли бы вы сказать, как сохранить выходные данные find . -type d и find . -type f в другом файле?

Ответы [ 7 ]

83 голосов
/ 14 апреля 2009

В окнах для просмотра только каталогов:

dir /ad /b /s

для просмотра всех файлов (и без каталогов):

dir /a-d /b /s

перенаправить вывод в файл:

dir /a-d /b /s > filename.txt

Параметры команды dir, описанные в Википедии

22 голосов
/ 14 апреля 2009

в оболочке:

find . -type d

выдает каталоги из текущего рабочего каталога и:

find . -type f

дает файлы из текущего рабочего каталога.

Замените . на интересующий вас каталог.

21 голосов
/ 14 апреля 2009

Bash / Linux Shell

Каталоги:

find ./ -type d 

Файлы:

find ./ -type f 

Bash / Shell Into

Справочники:

find ./ -type d  > somefile.txt

Файлы:

find ./ -type f  > somefile.txt
7 голосов
/ 14 апреля 2009

В Windows вы можете сделать это как наиболее гибкое решение, которое позволяет вам дополнительно обрабатывать имена каталогов.

Вы используете FOR / R для рекурсивного выполнения пакетных команд.

Проверьте этот командный файл.

@echo off
SETLOCAL EnableDelayedExpansion

SET N=0
for /R %%i in (.) do (
     SET DIR=%%i

     ::put anything here, for instance the following code add dir numbers.
     SET /A N=!N!+1
     echo !N! !DIR!
)

Аналогично для файлов вы можете добавить шаблон в виде набора вместо точки, в вашем случае

 (*.*)
3 голосов
/ 16 января 2014

Это старый вопрос, но я все равно решил что-нибудь добавить.

DIR неправильно просматривает все деревья каталогов, которые вы хотите, в частности, не те, что на C :. Он просто сдается местами из-за разных защит.

ATTRIB работает намного лучше, потому что он находит больше. (Почему такая разница? Почему MS заставляет одну утилиту работать так или иначе, а другую - в этом отношении? Будь я проклят, если знаю.) По моему опыту, самый эффективный способ справиться с этим, хотя это и клочок, - получить два списка:

attrib / s / d C: \>% TEMP% \ C-with-directoryies.txt

attrib / s C: \>% TEMP% \ C-without-directoryies.txt

и получите разницу между ними. Эта разница в каталогах на C: (кроме тех, которые слишком хорошо спрятаны). Для C: обычно я делаю это с правами администратора.

3 голосов
/ 14 апреля 2009

В Linux просто

find . -printf '%y %p\n'

предоставит вам список всех содержащихся элементов, со смешанными каталогами и файлами. Вы можете сохранить эти выходные данные во временном файле, а затем извлечь все строки, начинающиеся с 'd'; это будут каталоги. Строки, начинающиеся с 'f', являются файлами.

3 голосов
/ 14 апреля 2009

В Windows:

dir / ad / b / s

dir / a-d / b / s

...