Як зняти провідний "./" в unix "find"?


140
find . -type f -print

роздруковує

./file1
./file2
./file3

Будь-який спосіб зробити його друком

file1
file2
file3

?


1
якщо ви використовували -exec /path/to/myscript.sh {} в своєму find, -printf '%P\n'це не працює. Натомість я маю робити ./префікс, що чіпляє всередині сценарію:p=${1#"./"}
truthadjustr

Якщо ви робите це лише для одного файлу:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Відповіді:


38

Якщо вони лише в поточному каталозі

find * -type f -print

Це те, чого ти хочеш?


21
При цьому будуть пропущені файли з іменами, які починаються з періоду.
Шон

2
Погано, залежно від налаштувань оболонки * може не оцінюватись на «приховані» файли / каталоги - ті, що починаються з крапки (.). Спробуйте запустити цю команду у своєму домашньому режимі, тоді просто «знайдіть тип f» і побачите різницю .
Ілля К.

35
Більш актуальною проблемою є те, що "*" оцінюється оболонкою. У вас фактично існує ситуація з введенням шкідливого коду. Було б тривіально створити файл під назвою '--exec rm' та інший під назвою 'zzzz;'. Прощайте файли.
CWF

6
Це небезпечно. Якщо ім’я файлу починається з тире, воно буде розглядатися як варіант пошуку, і може вийти з ладу, або може призвести до шкоди.
Дейл Андерсон

4
Чому це -printпотрібно? Це дало такий же результат і без цього прапора.
користувач13107

239

Знайдіть лише звичайні файли в поточному каталозі та друкуйте їх без ./префіксу:

find -type f -printf '%P\n'

З пошуку людини, опис -printfформату:

% P Ім'я файлу з назвою аргументу командного рядка, під яким його було знайдено видалено.


18
+1 Гарне рішення, якщо ваша версія findпідтримує -printf(не всі).
Тодд Оуен

2
Як сказав Тодд, але точніше: це не POSIX 7.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8
Підтримується чи ні, це, безумовно, безпечніше прийнятої відповіді.
Дейл Андерсон

10
Ви можете використовувати \0замість цього, \nякщо ви хочете передати його xargs -0(наприклад, якщо find -type f -printf '%P\0' | xargs -0 head
файли

1
@Quanlong, він працює на macOS, якщо ти brew install findutils;)
blockloop

58

Використовуйте sed

find . | sed "s|^\./||"

2
Це моє бажане рішення; він сумісний з POSIX (працює практично скрізь, навіть вбудовані системи), дуже короткий і навряд чи призведе до несподіваної поведінки. Це має бути прийнятою відповіддю.
Джоді Брушон

6
Як би це поєднувалося find -exec?
Пол Вінц

find -exec sh -c "echo {} | sed 's|^\./||'" \; або find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

він може бути коротшим

find * -type f

Краще, 2> /dev/nullщоб ігнорувати помилку, про яку повідомляється, коли команда виконується в порожньому каталозі.
neevek

2

Інший спосіб зачистки - ./це використання cut:

find -type f | cut -c3-

Подальше пояснення можна знайти тут


2

Ще один спосіб зачистки ./

find * -type d -maxdepth 0

Хоча цей код може вирішити питання, включаючи пояснення, як і чому це вирішує проблему, справді допоможе покращити якість вашої публікації та, ймовірно, призведе до збільшення кількості голосів. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз задає питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Девід Бак

2

Оскільки -printfопція недоступна для OSX, findось одна команда, яка працює на пошуку OSX, про всяк випадок, якщо хтось не хоче встановлювати gnu findза допомогою brewтощо:

find . -type f -execdir printf '%s\n' {} + 

1
На жаль, це позбавляє весь шлях кожного знайденого файлу, включаючи проміжні підкаталоги, і просто друкує саме ім'я файлу.
PLL

1
Ти правий. Це рішення корисне лише для файлів у поточному каталозі. Для вкладених файлів нам потрібно використовувати:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.