我在 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 个问题。
- 你应该使用该
-name
选项 - 与其将目录列表保存在变量中然后
wc -l
稍后再执行,不如按照 @yaegashi 的建议一步一步执行。 - 当您需要
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