如何更改特定文件类型的权限

如何更改特定文件类型的权限
 file * |  grep 'ASCII text' | chmod -x 
chmod: missing operand
Try `chmod --help' for more information.

上述命令给出了错误。基本上,我试图查找所有类型为 ASCII 的文件并将其权限更改为 -x。上述语法有什么错误?

答案1

一: grep 'ASCII text'返回不仅文件名,以及文件本身的类型;您需要处理输出以返回仅有的文件名

二: chmod不接受来自 STDIN 的参数,而这正是您尝试使用管道执行的操作|。您必须使用xargs或将上述内容包装在for循环中

话虽如此,这里为您提供了两个解决方案:

解决方案 #1:使用管道

file * | awk '/ASCII text/ {gsub(/:/,"",$1); print $1}' | xargs chmod -x

解决方案 #2:使用 for 循环

for fn in $(file * | awk '/ASCII text/ {gsub(/:/,"",$1); print $1}'); do chmod -x "$fn"; done

选择你的毒药:-)

答案2

无论文件名是否包含空格或冒号,这都应该有效:

find -maxdepth 1 -type f -exec sh -c 'file -b "{}" | grep -sq ASCII' \; -print0 | xargs -0 chmod -x

您可以删除-maxdepth 1以使其递归。

如果文件名本身包含字符串“ASCII”,则可能会出现误报。

编辑:

我采纳了 pepoluan 的建议,使用-b选项,file这样测试时就不会输出文件名grep。这应该可以消除误报。

答案3

for f in `file * | grep "ASCII text" | awk "{print \\$1}" | awk -F ":" "{print \\$1}"`; do chmod -x "$f"; done

答案4

还有一句——注意需要删除: ASCII Text并引用名称

file * | grep 'ASCII text' | sed  's|\(^.*\):.*|\"\1\"|'| xargs chmod -x

相关内容