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


9

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

У результат-результат іноді включається подвійний косий рядок (//).

Приклад (після "Завантаження"):

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

Я спершу подумав, що це позначить поточний робочий каталог. Але це не так.

У чому сенс цієї подвійної косої риски?

Зазвичай я копіюю результат у буфер обміну, переходжу до пошуку. Потім "shift" + "команда" + "g" і вставляючи шлях (до файлу) у поле. Так що каталог, що містить, відкриється.

Добре працює. Але подвійну косу рису я повинен зняти вручну.

Тому: Як я можу цього уникнути?


2
Зауважте, що не потрібно видаляти подвійну косу рису. Подвійна коса коса риса є особливою лише на початку шляху, і лише якщо це рівно дві косої риски. Кілька косої риски в середині або в кінці або будь-яка кількість косої риски, ніж рівно дві на початку, рівно еквівалентні одній косій рисі. Це гарантується специфікацією POSIX / SUS.
Йорг W Міттаг

Відповіді:


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.

Як я можу цього уникнути?

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

Натомість я пропоную зробити одну з таких речей:

a) Зробіть обгортку, щоб знайти, що труби до sed: | sed 's @ // @ / @'

b) Встановіть Findutils GNU за допомогою 'brew install findutils', а потім або скористайтеся 'gfind' безпосередньо, псевдонім 'find' для 'gfind', або додайте / usr / local / opt / findutils / libexec / gnubin на свій шлях (що також додає GNU findutils '' locate ',' updatedb ', &' xargs ').

в) Перейдіть на належну ОС GNU / Linux, яка б не мала цієї проблеми (і тисяча інших) в першу чергу. : с


1
Просто додайте set mark-directories offдо свого. inputrcі ти добре підеш. Від одного з тих старих хлопців з BSD.
fd0

@ fd0 тоді не вдалося б розрізнити між dirs і файлами з однаковою назвою; це знахідка BSD, яка тут трохи хитра, а не баш або
ридлін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.