Как правило, пустая строка не обозначает текущий каталог, ни для команд оболочки, ни в системных вызовах. Это было на некоторых старых системах, но не на POSIX-совместимых системах .
Иногда вы можете найти программу, которая использует текущий каталог, когда вы передаете пустую строку, и программа ожидает имя каталога. Иногда это является преднамеренным, а иногда побочным эффектом добавления абсолютного пути к текущему каталогу, когда данная строка не начинается с косой черты.
Лучше всего было бы оставить ./. Это не приносит никакого вреда.
Если список файлов предназначен для
find . … | sed 's!^\./!!'
Обратите внимание, что это искажает некоторые имена файлов, содержащие переводы строк. Обычно это не проблема для потребления человеком, и вывод findне подходит для потребления программой, поскольку он неоднозначен. Если вы используете -print0, который подходит для использования в программе, вам, вероятно, все равно не нужен ./префикс.
Вы можете использовать find * …вместо find . …, но обратите внимание, что find *есть ряд дефектов, которые делают его непригодным в целом:
. опущен
- Все точечные файлы (файлы, имя которых начинается с
.или ..`) опущены.
- Если в текущем каталоге есть имя файла, имя которого начинается с
-(или файл с именем !или (...), оно будет интерпретировано как опция или предикат find.
Первый пункт не имеет значения, исключает ли ваш фильтр текущий каталог. Во-вторых, вы можете использовать шаблоны ..?* .[!.]* *для сопоставления всех файлов в текущем каталоге, но вам нужно проверить, соответствует ли каждый шаблон хотя бы одному файлу, и пропустить его, если это не так. Это возможно, но очень громоздко. Последний пункт - пробка. Так что find *может подойти для быстрого использования командной строки, но не используйте его в скрипте.
Альтернативный подход состоит в том, чтобы использовать рекурсивное средство оболочки, например
printf '%s\n' **/*.h
Это должно быть активировано с помощью shopt -s globstarbash и set -o globstarksh93, и не существует в базовой оболочке POSIX, такой как dash. Точечные файлы не будут проходить по умолчанию; чтобы включить их, сначала сделайте globbing, а не игнорируйте точечные файлы shopt -s dotglobв bash или FIGNORE='@(.|..)'в ksh93. Также, если совпадений нет, эта команда печатает шаблон; запустите shopt -s nullglobbash, чтобы вместо этого напечатать пустую строку, и используйте шаблон ~(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делает.