Я хочу перечислить только файлы и каталоги и никаких дополнительных данных. Он используется для анализа данных, и мне не нужны дополнительные элементы, такие как размер файла, разрешения и т. Д.
TIA
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.