если вы использовали -exec /path/to/myscript.sh {} в своем find, то -printf '%P\n'не работает. Вместо этого я должен выполнить ./префиксный чиппинг внутри скрипта следующим образом:p=${1#"./"}
trueadjustr
Если вы делаете это только для одного файла:f=`find . -name migration`; echo ${f/.\//}
Это пропустит файлы с именами, которые начинаются с точки.
Шон
2
Плохо, в зависимости от настроек оболочки * может не соответствовать «скрытым» файлам / каталогам - тем, которые начинаются с точки (.). Попробуйте запустить эту команду в вашем домашнем каталоге, затем просто «найдите -type f» и увидите разницу ,
Илья К.
35
Более актуальная проблема заключается в том, что '*' оценивается оболочкой. У вас фактически есть тип внедрения вредоносного кода. Было бы тривиально создать файл с именем --exec rm, а другой - с именем zzzz; Прощай, файлы.
CWF
6
Это небезопасно. Если имя файла начинается с тире, оно будет рассматриваться как опция для поиска, оно может потерпеть неудачу или потенциально может привести к повреждению.
Дейл Андерсон
4
Почему -printтребуется? Это дало тот же результат без этого флага.
user13107
239
Найдите только обычные файлы в текущем каталоге и напечатайте их без ./префикса " ":
find -type f -printf '%P\n'
От человека найти, описание -printfформата:
% P Имя файла с именем аргумента командной строки, под которым он был найден, удален.
Это мое предпочтительное решение; это POSIX-совместимый (работает практически везде, даже встроенные системы), очень короткий и вряд ли приведет к неожиданному поведению. Это должен быть принятый ответ.
Джоди Брухон
6
Как это будет сочетаться с find -exec?
Пол Винц
find -exec sh -c "echo {} | sed 's|^\./||'" \; или find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, получит больше голосов "за". Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для того, кто спрашивает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснения и указать, какие ограничения и предположения применяются.
Дэвид Бак
2
Поскольку -printfопция недоступна в OSX, findздесь есть одна команда, которая работает с OSX find, на тот случай, если кто-то не хочет устанавливать gnu findс помощью brewetc:
К сожалению, это удаляет весь путь каждого найденного файла, включая промежуточные подкаталоги, и просто печатает само имя файла.
PLL
1
Ты прав. Это решение подходит только для файлов в текущем каталоге. Для вложенных файлов нам нужно использовать:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
-exec /path/to/myscript.sh {}
в своемfind
, то-printf '%P\n'
не работает. Вместо этого я должен выполнить./
префиксный чиппинг внутри скрипта следующим образом:p=${1#"./"}
f=`find . -name migration`; echo ${f/.\//}
Ответы:
Если они только в текущем каталоге
find * -type f -print
Это то, что вы хотите?
источник
-print
требуется? Это дало тот же результат без этого флага.Найдите только обычные файлы в текущем каталоге и напечатайте их без
./
префикса " ":От человека найти, описание
-printf
формата:источник
find
поддерживает-printf
(не все так делают).\0
вместо,\n
если вы хотитеxargs -0
find -type f -printf '%P\0' | xargs -0 head
brew install findutils
;)Используйте sed
источник
find -exec
?find -exec sh -c "echo {} | sed 's|^\./||'" \;
илиfind -exec sh -c "sed 's|^\./||' <<< '{}'" \;
это может быть короче
источник
2> /dev/null
игнорировать сообщение об ошибке, когда команда запускается в пустом каталоге.Другим способом удаления
./
является использованиеcut
вроде:Дальнейшее объяснение можно найти здесь
источник
Еще один способ зачистки ./
источник
Поскольку
-printf
опция недоступна в OSX,find
здесь есть одна команда, которая работает с OSX find, на тот случай, если кто-то не хочет устанавливатьgnu find
с помощьюbrew
etc:источник
find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +