特定のパターンがあるディレクトリを見つけると、権限拒否エラーが発生し、結果はありません。

特定のパターンがあるディレクトリを見つけると、権限拒否エラーが発生し、結果はありません。

Linuxには次のシェルスクリプトがあります。

#!/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ただし、この質問はエラーメッセージとは関係ありません。なぜなら、ディレクトリが存在するかどうかにかかわらず、行数が常にゼロであるように見えるからです。

答え1

あなたはそれを行うことができないので、$allDirsおそらく次のことをしたいと思います。

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

ただし、このバージョンでは$allDirs1行に拡張されるため、常に1が得られます$lines

最も簡単な解決策は、find出力を次に直接パイプすることですwc

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

答え2

コードには2つの主な問題があります。

1つ目は、ユーティリティがfind必要ないということです。模様最初の引数として単一のパスを使用します。

複数のディレクトリを繰り返すには、find次のループを実行します。

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

$allDirs2番目は、実行時に実行したい変数の内容です$($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

関連情報