Как убрать ведущий «./» в unix «find»?

140
find . -type f -print

распечатывает

./file1
./file2
./file3

Любой способ напечатать

file1
file2
file3

?

breadjesus
источник
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
ghostdog74
источник
Лучше 2> /dev/nullигнорировать сообщение об ошибке, когда команда запускается в пустом каталоге.
neevek
2

Другим способом удаления ./является использование cutвроде:

find -type f | cut -c3-

Дальнейшее объяснение можно найти здесь

banjoAtix
источник
2

Еще один способ зачистки ./

find * -type d -maxdepth 0
Valheru
источник
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, получит больше голосов "за". Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для того, кто спрашивает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснения и указать, какие ограничения и предположения применяются.
Дэвид Бак
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' {} +
анубхава