while read -d $'\0' file; do
found=yes
echo "Modifying $file"
chmod 755 "$file"
done < <(find /data -type f -perm 400 -print0)
if [ "x$found" != "xyes" ]; then
echo "No files found to modify"
fi
这使用了Bash 中的进程替换功能。相当于
find ... | while read ...
除了在这种情况下,while read
在子shell中执行,所以我们不能设置将在外壳中看到的变量。相反,我们可以使用进程替换。<(cmd)
在子 shell 中运行cmd
,其标准输出重定向到命名管道。该管道的名称被替换到外部命令中。
然后我们使用<
从这个管道重定向到while read
命令的标准输入,它依次读取每个分隔记录,并将值存储在指定的名称中(file
在本例中)。默认情况下,read
换行符换行。对于大多数文件来说,这很好;你可以这样做:
while read file; do
...
done < <(find /data -type f -perm 400)
它会正常工作。但是从技术上讲,文件名中可以有换行符,在这种情况下会中断。-print0
find的参数和 的-d $'\0'
参数read
导致它们每个都使用空字符作为分隔符,这在文件名中无效。