Как убрать ведущий «./» в 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#"./"}
trueadjustr

Если вы делаете это только для одного файла:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Ответы:


38

Если они только в текущем каталоге

find * -type f -print

Это то, что вы хотите?


21
Это пропустит файлы с именами, которые начинаются с точки.
Шон

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

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

6
Это небезопасно. Если имя файла начинается с тире, оно будет рассматриваться как опция для поиска, оно может потерпеть неудачу или потенциально может привести к повреждению.
Дейл Андерсон

4
Почему -printтребуется? Это дало тот же результат без этого флага.
user13107

239

Найдите только обычные файлы в текущем каталоге и напечатайте их без ./префикса " ":

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

От человека найти, описание -printfформата:

% P Имя файла с именем аргумента командной строки, под которым он был найден, удален.


18
+1 Хорошее решение, если ваша версия findподдерживает -printf(не все так делают).
Тодд Оуэн

2
Как сказал Тодд, но точнее: это не POSIX 7.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

8
Поддерживается или нет, это определенно безопаснее, чем принятый ответ.
Дейл Андерсон

10
Вы можете использовать \0вместо, \nесли вы хотите xargs -0find -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 find, на тот случай, если кто-то не хочет устанавливать gnu findс помощью brewetc:

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

1
К сожалению, это удаляет весь путь каждого найденного файла, включая промежуточные подкаталоги, и просто печатает само имя файла.
PLL

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