【问题标题】:How to check if a file is executable in Bash [duplicate]如何检查文件在 Bash 中是否可执行 [重复]
【发布时间】:2017-03-06 18:56:12
【问题描述】:

我正在尝试建立一个条件来检查文件是否设置了执行访问位。我无法使用 grep 和查找。

我尝试检查ls -l 命令中的“x”字母,但在很多情况下这是错误的。

for val in `ls $1`
do
  if [[ "`ls -l $1/$val`" -eq *w* ]]
  then
    rm $1/$val
  fi
done

请帮忙或者给点建议!

【问题讨论】:

标签: bash ls


【解决方案1】:

无需解析ls 的输出来查看文件是否可执行。 Shell 提供了内置的-x 检查。使用-x 功能,您的循环可以重写为:

for file in "$1"/*; do
  [[ -x "$file" ]] && rm -- "$file"
done

另见:

【讨论】:

  • "$1"/*,您的意思是(处理目录名称中的空格)。还有rm -- "$file",如果我们要处理$1 是以破折号开头的目录名称的情况。
【解决方案2】:
if [ -x "$file" ]; then
  # do something
fi

您可以使用man 获得更多文件测试选项:

~]# man test
.... 
-x FILE
              FILE exists and execute (or search) permission is granted

以下应该可以工作:

 ~]# find $1 -type f | while IFS='' read -r -d '' p; 
     do 
        if [ -x "$p" ]; then 
           echo "removing $p";
           rm "$p";
        fi; 
     done

find 命令获取$1 给定目录下的所有文件(包括.)。 while 读取每个输出,if then 使用-x 检查单个文件的可执行权限。

编辑

在一些 cmets 之后,这是一个更快捷的示例:

find "$1" -type f -executable -exec rm -- {} \;

【讨论】:

  • [ -x $file ] 如果$file 是一个空字符串,将错误地返回true,因为它将运行[ -x ],它测试-x 是否是一个空字符串(并且,因为它是非空的, 返回真)。使用引号:[ -x "$file" ]
  • 这也完全没有涵盖正确/可靠地检索文件名(for val in `ls $1` 充满了已知问题:无法正确处理带有空格的名称,不可打印字符的行为因平台而异,行为与包含换行文字的文件名完全未定义,等等)。
  • 在解析ls 的输出的所有情况下,解析find 的输出都会失败,甚至没有必要。您可以使用-perm 主要选择可执行文件,然后使用-exec rm -- {} \;(或-delete,如果支持)删除它们。
  • 行情! find "$1" -type f -executable -exec rm -- {} + -- 如果没有 $1' 周围的引号,则名为 ./My Directory 的目录将作为两个参数传递,./MyDirectory
  • 另外,-exec rm -- {} \; 效率低下,每找到一个文件就运行一次rm,而-exec rm -- {} + 调用rm 的次数尽可能少,每次调用都会将多个文件名放到命令行中。
猜你喜欢
  • 2013-04-21
  • 2013-05-04
  • 2012-05-26
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多