Ответы:
Для работы со сложными именами файлов лучше всего разделять имена файлов символами NUL. GNU grep
поддерживает это с помощью --null
опции и xargs
поддерживает это с помощью -0
опции. Таким образом, попробуйте:
grep --null -rslZ "foo" | xargs -0 sed -i -- "s/foo/bar/g"
grep --null -rslZ "foo" | while IFS= read -r -d $'\0' file
do
sed -i -- "s/foo/bar/g" "$file"
done
for..in..do..done
?
--null
который поддерживается как GNU, так и FreeBSD . Страница людей OpenBSD , однако , не перечислить любую поддержку NUL.
for
циклическом переборе имен файлов с пробелами.
for f in *.txt
. Не пытайтесь делать что-то фантастическое там - это почти наверняка потерпит неудачу.
grep
s и т.п.:find . -type f -print0 | xargs -0 grep -sl 'foo' | tr '\n' '\0' | xargs -0 sed -i -e 's/foo/bar/g' --
find . -type f -exec grep -qF foo {} \; -exec sed -i 's/foo/bar/g' {} \;