Ваша команда ненадежна по нескольким причинам : она исключает все пути, содержащие .git
в качестве подстроки, она не работает с путями, содержащими пробелы или \ '"
, он заменяет ввод любым символом между com
и foo
. Последняя проблема легко решается добавлением обратной косой черты перед точкой. имена файлов могут быть, а могут и не быть проблемой в вашей настройке - деревья исходных текстов имеют тенденцию быть ручными. Также -name "*"
является избыточным (оно всегда совпадает). Вот безопасная и более простая альтернатива, которая должным образом опускает поддерево .git
.
find . -name .git -prune -o -type f -exec sed -i 's/com\.foo/org.bar/g' {} +
Это все еще заменяет, например, com.fooalso
на org.baralso
, что, вероятно, нежелательно, если это произойдет. Вот более безопасная конструкция ction:
find . -name .git -prune -o -type f -exec sed -i -e 's/com\.foo$/org.bar/' -e 's/com\.foo\([^-_0-9A-Za-z]\)/org.bar\1/' {} +
Загрузите функцию zmv
с автозагрузкой -U zmv
, затем вы можете использовать ее для переименования файлов на основе шаблонов подстановочных знаков . Я думаю, что вы ищете на самом деле
zmv -w '**/com/foo' '$1/org/bar'
zmv -w '**/*com.foo' '$1/${2}org.bar'
zmv '(**/)(*)com.foo([^-_0-9A-Za-z]*)' '$1${2}org.bar$3'
Я использую пример из вашего предыдущего вопроса в качестве примера для параллелизма GNU
ls *.mp4 | parallel ffmpeg -i {} fr1/{.}_%d.jpg -hide_banner
Я могу изменить ответ, если это не совсем то, что вам нужно. «{}» заменяется GNU параллельно с полным именем файла, а «{.}» заменяется именем файла с удаленным последним сегментом, разделенным точками.