특정 패턴이 있는 디렉터리를 찾으면 권한 거부 오류가 발생하고 결과가 없습니다.

특정 패턴이 있는 디렉터리를 찾으면 권한 거부 오류가 발생하고 결과가 없습니다.

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가지 문제가 있습니다.

  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

관련 정보