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
그러나 이 질문은 오류 메시지와 관련이 없습니다. 왜냐하면 디렉터리의 존재 여부에 관계없이 행 수가 항상 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