bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .*
sed: .: in-place editing only works for regular files
我尝试在文件夹中的每个点文件中替换每个/ sa / with / he /。我怎样才能让它发挥作用?
答案 0 :(得分:8)
使用find -type f
仅查找与名称.*
匹配的文件,并排除目录.
和..
。 -maxdepth 1
阻止find
递归到子目录。然后,您可以使用-exec
执行sed
命令,使用{}
占位符告诉find
文件名应该去哪里。
find . -type f -maxdepth 1 -name '.*' -exec sed -i.bakkk -e "s#/sa/#/he/#g" {} +
使用-exec
优于使用反引号或xargs
,因为它甚至可以在包含空格甚至换行符的奇怪文件名上工作 - 是的,"foo bar\nfile"
是有效的文件名。值得一提的是find -print0 | xargs -0
find . -type f -maxdepth 1 -name '.*' -print0 | xargs -0 sed -i.bakkk -e "s#/sa/#/he/#g"
同样安全。但它更冗长,而且灵活性较低,因为它仅适用于文件名最后的命令(不可否认,99%的命令)。
答案 1 :(得分:2)
试试这个:
sed -i.bakkk -e "s#/sa/#/he/#g" `find .* -type f -maxdepth 0 -print`
这应该忽略所有目录(例如.elm,.pine,.mozilla)而不仅仅是。和..我认为其他解决方案没有抓住。
答案 2 :(得分:1)
glob模式.*
包含特殊目录.
和..
,您可能并不想将其包含在您的模式中。我想不出一种优雅的方式来排除它们,所以这是一种不雅的方式:
sed -i.bakkk -e "s$/sa/#/he/#g" $(ls -d .* | grep -v '^\.\|\.\.$')