Linux中的条件文件逻辑

时间:2017-04-20 16:13:49

标签: file-permissions ksh

我在下面编写了一些代码来查找当前用户无法读取的文件。它给我的消息是,在父文件夹的子目录中无法读取文件,即使我在循环外部的脚本底部明确地测试了它报告为不可读的文件之一。但是,我已经检查过,并且所有文件都设置了允许阅读的群组权限,并且我已经使用vi打开了其中的几个。这是怎么回事?

脚本:

#!/bin/ksh
set -A files $(ls -1 $1)
echo "${#files[@]}"

for((i=0; $i < ${#files[@]}; i++)); do
  if [ ! $2 ${files[$i]} ]; then
    echo "${files[$i]} not $2"
  fi
done

echo "============"
if [ ! -r ./tmp/feederseries.txt ]; then
  echo "./tmp/feederseries.txt not readable"
fi

输出:

$ testfiles.sh "*" -r
212
./buildhist: not -r
20170109_124058.txt not -r
20170109_124128.txt not -r
./cmpatches: not -r
tmp.txt not -r
./reports: not -r
archived not -r
./tmp: not -r
feederseries.txt not -r
============

1 个答案:

答案 0 :(得分:2)

不需要数组来执行此操作。使用ls循环遍历文件列表无论如何都不是最好的主意。有关说明,请参阅http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29

使用ls -1 *,您将获得实际目录中的文件列表,子目录后跟&#39;:&#39;和子目录中的文件。子目录中的文件被报告为不可读,因为它们不存在于实际目录中(您进行测试的地方)。

让shell负责扩展并遍历列表:

#!/bin/ksh
for file in $1; do
    if [ ! $2 $file ] ; then
      echo "$file not $2"
    fi
done

如果您只需要不可读的文件,可以这样做:

find .. ! -perm /u=r -print