Команда «найти» для терминала Mac: что означает двойная косая черта в выводе результата?

9

Я использую команду find для поиска в больших и вложенных структурах каталогов.

В результат-вывод иногда включается двойная косая черта (//).

Пример (после «Загрузки»):

#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf

Сначала я подумал, что это отметит текущий рабочий каталог. Но это не так.

В чем смысл этой двойной косой черты?

Обычно я копирую результат в буфер обмена, меняю на искатель. Затем «shift» + «команда» + «g» и вставьте путь (до файла) в поле. Так что содержащий каталог открывается.

Работает отлично. Но двойную косую черту я должен удалить вручную.

Поэтому: как я могу избежать этого?

mizech
источник
2
Обратите внимание, что вам не нужно удалять двойную косую черту. Двойная косая черта является особенной только в начале пути, и только если это ровно две косые черты. Несколько косых черт в середине или в конце или любое количество косых черт, чем ровно две в начале, в точности эквивалентны одной косой черте. Это гарантировано спецификацией POSIX / SUS.
Йорг Миттаг

Ответы:

17

findдовольно буквально. Когда вы указываете ему искать в «~ / Downloads /», он использует его (включая завершающий слеш) в качестве префикса для всего, что он находит. Поскольку в конце пути, который вы ему указали, возникает ненужный и нерелевантный слеш, в результате вы получите ненужный и неуместный дополнительный слеш на выходе.

Решение: удалите завершающий символ "/" из каталога поиска:

#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf
#> find ~/Downloads -iregex ".*some.*"
/Users/michael/Downloads/subDirectory/some_file.pdf
Гордон Дэвиссон
источник
4

В чем смысл этой двойной косой черты?

Значит вы используете странную старую BSD find.

Как я могу избежать этого?

Вы действительно можете опустить косую черту в своей исходной команде, но так как она добавляется автоматически через завершение табуляции (которую вы, безусловно, должны использовать как можно больше), и так как косая черта фактически используется в бесчисленных местах в других местах, чтобы быть уверенным, что вы Вы имеете дело с каталогом, а не с именем файла, опускать его нелогично и глупо.

Вместо этого я предлагаю сделать одну из следующих вещей:

а) Сделайте обёртку, чтобы найти, что трубы для седа: | sed 's @ // @ / @'

б) Установите GNU findutils с помощью «brew install findutils», а затем либо напрямую используйте «gfind», псевдоним «find» для «gfind», либо добавьте / usr / local / opt / findutils / libexec / gnubin к вашему пути (который также добавляет GNU findutils '' locate ',' updatedb 'и & xargs').

c) Переключитесь на правильную ОС GNU / Linux, у которой не было бы этой проблемы (и тысячи других) в первую очередь. :п

Ян Кью Пеблик
источник
1
Просто добавь set mark-directories offв свой. inputrcи ты в порядке. От одного из тех старых парней из BSD.
fd0
@ fd0 тогда нельзя было бы различить каталоги и файлы с одинаковыми именами; это BSD находит здесь немного грубоватым, а не bash или readline
Jan Kyu Peblik