相关疑难解决方法(0)

为什么循环查找的输出是不好的做法?

这个问题的灵感来自

为什么使用 shell 循环处理文本被认为是不好的做法?

我看到这些结构

for file in `find . -type f -name ...`; do smth with ${file}; done
Run Code Online (Sandbox Code Playgroud)

for dir in $(find . -type d -name ...); do smth with ${dir}; done
Run Code Online (Sandbox Code Playgroud)

几乎每天都在这里使用,即使有些人花时间对这些帖子发表评论,解释为什么应该避免这种东西......
看到此类帖子的数量(以及有时这些评论被简单地忽略的事实)我想我还不如问一个问题:

为什么循环find的输出是不好的做法,为 返回的每个文件名/路径运行一个或多个命令的正确方法是find什么?

find filenames files for

193
推荐指数
4
解决办法
3万
查看次数

如何使用 sed -i(就地编辑)实现可移植性?

我正在为我的服务器编写 shell 脚本,这是一个运行 FreeBSD 的共享主机。我还希望能够在运行 Linux 的 PC 上本地测试它们。因此,我试图以可移植的方式编写它们,但sed我认为没有办法做到这一点。

我的网站的一部分使用生成的静态 HTML 文件,并且此 sed 行在每次重新生成后插入正确的 DOCTYPE:

sed -i '1s/^/<!DOCTYPE html> \n/' ${file_name.html}
Run Code Online (Sandbox Code Playgroud)

它适用sed于 Linux上的 GNU ,但 FreeBSDsed期望-i选项后的第一个参数是备份副本的扩展名。这是它的样子:

sed -i '' '1s/^/<!DOCTYPE html> \n/' ${file_name.html}
Run Code Online (Sandbox Code Playgroud)

但是,GNUsed反过来又希望表达式紧跟在 之后-i。(它还需要修复换行符处理,但这里已经回答了)

当然,我可以在脚本的服务器副本中包含此更改,但这会造成混乱,即我使用 VCS 进行版本控制。有没有办法以完全可移植的方式使用 sed 实现这一点?

shell freebsd sed gnu portability

51
推荐指数
4
解决办法
2万
查看次数

标签 统计

filenames ×1

files ×1

find ×1

for ×1

freebsd ×1

gnu ×1

portability ×1

sed ×1

shell ×1