修改包含给定字符串的文件的权限

时间:2016-02-12 22:31:07

标签: regex linux bash

result=$(grep -r "find this string" / | 2> /dev/null) #don't care about permission denied errors, so ditch them.
#regex=':(.+)' #matches after the filename (ie. ':String to match')
for line in $result 
do
    #need to preform regex on result
    echo "line = $line..."
    chown root:root $line
    chmod 700 $line
done

我得到了一个命令,要求一个shell脚本,它将在整个Linux文件系统的所有文件中找到一个字符串(如/中所示),然后将这些文件的权限更改为只能由root用户使用。

我能想到的唯一方法是使用grep和regex(正则表达式来拉出结果的:string部分)但我无法弄清楚如何对bash变量执行正则表达式。< / p>

在Perl中它会像$line =~ s/$regex//g(抱歉,我的Perl也有点生锈)。

也欢迎更简单的解决方案。我可能过于复杂了:))

2 个答案:

答案 0 :(得分:1)

这是我放在一起的单行命令,它将“在整个Linux文件系统中的所有文件中找到一个字符串(如在/中),然后将这些文件的权限更改为仅可用(在本例中专门用于读取/写入root。“

find /. -type f -exec grep -rl 'textyouarelookingfor' {} \; -exec chmod 600 {} \; -exec chown root:root  {} \; > /dev/null 2>&1

它找到文件并搜索指定的文本,然后将权限和所有者/组更改为root。

我不能说它的美丽或速度,但我知道它就像子目录中文件的魅力一样!我不建议在您的机器上运行它,例如搜索“'。通过改变对你不期望的事物的许可,它可能弄乱整个机器......

将单行放入shell脚本中即可完成。

答案 1 :(得分:0)

要让grep只返回文件名,可以使用

grep -rl 'find this string' /

我们可以将它直接反馈到循环中,而不是将其保存到变量中然后依靠单词拆分来循环它:

while IFS= read -r fname; do
    chown root:root "$fname"
    chmod 700 "$fname"
done < <(grep -rl 'find this string' /)

<(...)构造称为process substitution。它基本上使得命令的输出行为类似于文件(确切地说是命名管道)。

请注意,您尝试的内容会返回匹配的行,并且对这些内容设置权限并没有多大意义。

此解决方案能够处理包含空格的文件名。要扩展它以便能够处理包含换行符的文件名,我们可以使用grep的-Z选项,这样做:

  

输出零字节(ASCII NUL字符),而不是通常跟随文件名的字符。

循环更改如下:

while IFS= read -r -d $'\0' fname; do
    echo chown root:root "$fname"
    echo chmod 700 "$fname"
done < <(grep -rlZ 'find this string' /)

其中-d $'\0'告诉read输入用零字节而不是换行符分隔。