如何使用脚本将 noatime 添加到 fstab 中?

如何使用脚本将 noatime 添加到 fstab 中?

我想添加noatimefstab的 bash 脚本来设置我的服务器。

如何以安全的方式自动执行此操作,/仅适用于分区?

简单来说:

如果该行尚未包含using bash/shell 代码,如何附加,noatime到第二个字符串为该行的第四个字符串?/noatime

示例文件:

# Comment
UUID=1234567890-abcdef    /     ext4  defaults,discard    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

需要得到:

# Comment
UUID=1234567890-abcdef    /     ext4  defaults,discard,noatime    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

答案1

这样就可以达到想要的效果了:

awk -i inplace '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab

这比您要求的更具体一些 -,noatime如果出现以下情况,将添加到第四个字段那个领域尚未包含noatime,它不会查看整行。

-i inplace是 Gawk 特有的;如果不支持,将结果写入新文件:

awk '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab > /etc/fstab.new && mv /etc/fstab{.new,}

在这两种情况下,我假设您的服务器设置脚本以 root 身份运行。

(谢谢埃德·莫顿用于强大的文本替换,避免使用时第四个字段中潜在的正则表达式出现问题sub!)

答案2

$ perl -p -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
# Comment
UUID=1234567890-abcdef    /     ext4  defaults,noatime,discard    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

在与正则表达式匹配的行上m:^[^#]+\s+/\s+: (即由空格包围的 /不是前面有#注释)并且不匹配noatime,它会修改要插入的行,noatime

注意:这会插入到,noatime后面defaults,而不是 后面discard。在我看来,这更有意义,因为defaults几乎肯定会存在(比discard无论如何更有可能)。

这会执行空运行,即它不会修改./fstab,仅显示它将对标准输出执行的操作。要使其实际修改文件,请使用 perl 的-i选项:

perl -p -i -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab

当然,将 ./fstab 更改为 /etc/fstab。

顺便说一句,如果您还想更改atimerelatimenodiratime等的任何现有实例,请添加一条语句来执行此操作第一的。例如

perl -p -e 'm:^[^#]+\s+/\s+: && /^[^#]+atime/ && s/([,\s])[^,\s]*atime/noatime/;
  m:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab

答案3

您可以使用在扩展正则表达式模式 (-E) 下运行的 GNU sed 来完成此操作。它将查看第二个字段是单斜杠“/”的行,并且第四个字段尚未包含整个单词“noatime”,然后它将其附加到第四个单词。

sed -E -e '
  \:^\s*\S+\s+/\s:!b
  s/\S+/\n&\n/4
  /\n(.*,)?noatime(,.*)?\n/!s/\n/,noatime/2
  s/\n//g
' /etc/fstab

相关内容