查找具有特定模式的目录会导致权限被拒绝错误并且没有结果

查找具有特定模式的目录会导致权限被拒绝错误并且没有结果

我在 Linux 上有这样的 shell 脚本:

#!/bin/sh
echo -n "Please enter directory pattern: "
read dirs
find $dirs > /tmp/justbay.txt


allDirs=$(find $dirs ! -readable -prune)
echo $allDirs
lines=$($allDirs | wc -l)
echo $lines

if [ $lines -eq 0 ]; then
 echo "Directory not found"
 exit 1
fi

echo $alldirs

我知道我可以做类似的事情:>/dev/null 2>&1但这个问题与错误消息无关,因为无论目录存在与否,行数似乎始终为 0。

答案1

因为你无法执行$allDirs.也许您想要执行以下操作:

lines=$(echo "$allDirs" | wc -l)

但在这个版本中,$allDirs它被扩展为一行,所以你总是会得到 1 $lines

最简单的解决方案是将输出find直接通过管道传输到wc

lines=$(find "$dirs" ! -readable -prune | wc -l)

答案2

您的代码有两个主要问题。

第一个是公用事业find不采取图案作为它的第一个参数,它采用单一路径。

如果要迭代多个目录,请find像这样循环执行:

for dir in $pattern; do
    find $dir ...
done

$allDirs第二个是你在执行时尝试执行变量的内容$($allDirs | wc -l)。您可能想要类似的东西$( echo $allDirs | wc -l ),具体取决于您对该特定行的意图。

答案3

您的脚本存在 3 个问题。

  1. 你应该使用该-name选项
  2. 与其将目录列表保存在变量中然后wc -l稍后再执行,不如按照 @yaegashi 的建议一步一步执行。
  3. 当您需要echo$alldirs变量时,请使用该变量quotes,以免*目录名称被扩展。

因此,您的find命令加上wc如下所示:

find -name "*$dir*" ! -readable -prune 2>/dev/null | wc -l

*即使对于名称中带有星号 ( ) 的目录,这也应该可以正常工作。

你的最终脚本将如下所示:

#!/bin/sh
echo -n "Please enter directory pattern: "
read dirs
find $dirs > /tmp/justbay.txt

$alldirs=$(find -name "*$dir*" ! -readable -prune 2>/dev/null)
$lines=$(find -name "*$dir*" ! -readable -prune 2>/dev/null | wc -l)

if [ $lines -eq 0 ]; then
 echo "Directory not found"
 exit 1
fi

echo "$alldirs" #Quoting is important, otherwise the asterisk may get expanded

相关内容