Как правило, пустая строка не обозначает текущий каталог, ни для команд оболочки, ни в системных вызовах. Это было на некоторых старых системах, но не на POSIX-совместимых системах .
Иногда вы можете найти программу, которая использует текущий каталог, когда вы передаете пустую строку, и программа ожидает имя каталога. Иногда это является преднамеренным, а иногда побочным эффектом добавления абсолютного пути к текущему каталогу, когда данная строка не начинается с косой черты.
Лучше всего было бы оставить ./
. Это не приносит никакого вреда.
Если список файлов предназначен для
find . … | sed 's!^\./!!'
Обратите внимание, что это искажает некоторые имена файлов, содержащие переводы строк. Обычно это не проблема для потребления человеком, и вывод find
не подходит для потребления программой, поскольку он неоднозначен. Если вы используете -print0
, который подходит для использования в программе, вам, вероятно, все равно не нужен ./
префикс.
Вы можете использовать find * …
вместо find . …
, но обратите внимание, что find *
есть ряд дефектов, которые делают его непригодным в целом:
.
опущен
- Все точечные файлы (файлы, имя которых начинается с
.
или ..`) опущены.
- Если в текущем каталоге есть имя файла, имя которого начинается с
-
(или файл с именем !
или (
...), оно будет интерпретировано как опция или предикат find
.
Первый пункт не имеет значения, исключает ли ваш фильтр текущий каталог. Во-вторых, вы можете использовать шаблоны ..?* .[!.]* *
для сопоставления всех файлов в текущем каталоге, но вам нужно проверить, соответствует ли каждый шаблон хотя бы одному файлу, и пропустить его, если это не так. Это возможно, но очень громоздко. Последний пункт - пробка. Так что find *
может подойти для быстрого использования командной строки, но не используйте его в скрипте.
Альтернативный подход состоит в том, чтобы использовать рекурсивное средство оболочки, например
printf '%s\n' **/*.h
Это должно быть активировано с помощью shopt -s globstar
bash и set -o globstar
ksh93, и не существует в базовой оболочке POSIX, такой как dash. Точечные файлы не будут проходить по умолчанию; чтобы включить их, сначала сделайте globbing, а не игнорируйте точечные файлы shopt -s dotglob
в bash или FIGNORE='@(.|..)'
в ksh93. Также, если совпадений нет, эта команда печатает шаблон; запустите shopt -s nullglob
bash, чтобы вместо этого напечатать пустую строку, и используйте шаблон ~(N)**/*.h
в ksh.
В zsh рекурсивное сглаживание включено по умолчанию. Используйте спецификатор glob, D
чтобы включить точечные файлы и N
напечатать пустую строку, если совпадений нет (по умолчанию zsh выдает ошибку, если шаблон не соответствует ни одному файлу). Вы можете использовать printf
как выше или
print -rl -- **/*.h(DN)
find
имеет параметр -printf для управления отображением результатов.find . -name '*.h' -printf '%P\n'
удалит./
префикс Посмотрите, чтоfind . -name '*.h' -print
делает.