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)
ただし、このバージョンでは$allDirs
1行に拡張されるため、常に1が得られます$lines
。
最も簡単な解決策は、find
出力を次に直接パイプすることですwc
。
lines=$(find "$dirs" ! -readable -prune | wc -l)
答え2
コードには2つの主な問題があります。
1つ目は、ユーティリティがfind
必要ないということです。模様最初の引数として単一のパスを使用します。
複数のディレクトリを繰り返すには、find
次のループを実行します。
for dir in $pattern; do
find $dir ...
done
$allDirs
2番目は、実行時に実行したい変数の内容です$($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