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