Как в bash перечислить только файлы?

Я хочу перечислить только файлы и каталоги и никаких дополнительных данных. Он используется для анализа данных, и мне не нужны дополнительные элементы, такие как размер файла, разрешения и т. Д.

TIA

3 ответа
3

п / м .. нашел. Решение: dir

    Используется для анализа данных

    Парсинг – а как?

    Если вы выполняете синтаксический анализ в такой оболочке:

    # don't
    for f in $(dir); do my_parser "$f"; done
    

    тогда это Ловушка номер один в Bash. В таком случае используйте for f in ./*; do ….

    С этого момента я предполагаю, что вы выполняете синтаксический анализ по конвейеру, например: dir | my_parser.


    Не анализируйте вывод ls/dir

    Ваш dir (из вашего ответа) вероятно только ls -C -b. В качестве вы не должны анализировать вывод ls, вы не должны анализировать вывод dir либо.


    Вы можете проанализировать вывод find

    Вы можете трубить find парсеру. Имена путей, содержащие символы новой строки, будут неверно интерпретированы во время синтаксического анализа. Для надежного синтаксического анализа используйте GNU find с -print0. Это завершит каждое имя пути нулевым символом (вместо символа новой строки). Сами имена путей не могут содержать нулевые символы, поэтому двусмысленности не будет. Решение POSIX -exec printf '%s' {} +. Инструменты POSIX обычно ожидают ввода текстовых файлов, и они не может принимать нулевые символы, но если ваш синтаксический анализатор может принимать строки с завершающим нулем, вы можете генерировать их из find это не поддерживает -print0.

    find по умолчанию спускается в подкаталоги. С GNU find вы можете изменить это, указав -maxdepth 1. Решение для поиска POSIX находится здесь: Ограничьте поиск POSIX определенной глубиной. Если отправной точкой является . тогда решение ( -name . -o -prune ).

    find starting_directory отпечатки starting_directory как первый путь. Я думаю, вы не хотели бы получать этот конкретный путь. Соответствующий тест ! -path starting_directory (Помните -path рассматривает свой аргумент как образец). Если начальный каталог указан как . тогда ! -name . будет достаточно. С GNU find -mindepth 1 является альтернативой, он будет работать независимо от начального каталога.

    Последняя команда может быть одной из следующих:

    find . -maxdepth 1 -mindepth 1                     # newline-terminated, GNU
    find . ( -name . -o -prune ) ! -name .           # newline-terminated, POSIX
    find . ! -name . -prune                            # newline-terminated, POSIX, simplified
    find . -maxdepth 1 -mindepth 1 -print0             # null-terminated, GNU
    find . ! -name . -prune -exec printf '%s' {} +   # null-terminated, POSIX
    

    Список не является исчерпывающим, существуют другие эквивалентные формы.

    Все приведенные выше команды генерируют выходные данные, в которых имена пути начинаются с ./ (по крайней мере, с find реализации, которые я тестировал, но, видимо, YMMV). Вы можете удалить этот префикс, подключившись к sed 's|^./||' (при завершении новой строки) или sed -z 's|^./||' (если завершается нулем; примечание -z поддерживается GNU sed но это не требуется POSIX). Например, вот так:

    find . ! -name . -prune | sed 's|^./||'
    

    Имейте в виду, что любое решение, использующее имена путей с завершением строки, завершится ошибкой или будет работать неправильно, если какое-либо имя пути содержит символ новой строки.


    Может тебе даже не нужно find

    Если ваш синтаксический анализатор написан вами на каком-либо языке программирования, вам следует использовать любой способ перечисления файлов, который предоставляет язык, вместо того, чтобы полагаться на отдельные исполняемые файлы, такие как ls, dir или же find. Должен быть абсолютно надежный способ перебора записей каталога.

      Как вы заметили, dir – хороший вариант, который по умолчанию настроен на то, что вы хотите, но эквивалентная команда для ls – который, будучи более распространенным инструментом, вероятно, более широко доступен в Unix-подобных системах – это ls -1 (это цифра 1, а не строчная L).

      Из man ls:

      -1     list one file per line.
      

        Добавить комментарий

        Ваш адрес email не будет опубликован. Обязательные поля помечены *