if 문에서 find 명령의 결과를 어떻게 사용하고 이를 true 또는 false와 비교할 수 있습니까?
이 같은:
if [ `find . -name test.txt -size 156c`="true" ]; then echo Found; fi
전체 스크립트는 다음과 같습니다.
#!/bin/bash
if [ $# -ne 2 ]
then
echo Not enough params
fi
if [ `find . -name $1 -size $2c | grep -q .` -eq 0 ]
then
echo OK
fi
답변1
find
어쩌면 단순히 출력을 파이프로 연결하는 것이 grep
트릭을 수행할 수도 있습니다.
if find . -name test.txt -size 156c | grep -q .; then echo Found; fi
find
설정한 이름 및 크기 기준과 일치하는 파일이 발견되지 않는 한 호출에는 출력이 없으며 grep .
입력이 비어 있지 않은 경우에만 종료 상태가 0("true")이 됩니다. 이 옵션을 -q
사용하려면 출력이 인쇄되지 않아야 합니다. 여기서는 종료 상태만 고려하므로 여기서는 중요하지 않습니다.
혼란의 또 다른 원인을 제거하려면: @derobert가 주석에서 언급했듯이 괄호는 구성 구문의 일부가 아닙니다 . 부울 표현식을 평가하는 역할을 담당하는 명령이 다음과 같은 형식으로 if
있음을 알 수 있습니다. [
종료 코드 실제 값을 반환합니다( [
쉘 내장형일 수도 있음). 이 명령은 닫는 대괄호가 있는지 확인합니다.
$ [ 3 -gt 2 ] ; echo $?
0
$ [ 3 -lt 2 ] ; echo $?
1
$ [ 3 -lt 2 ; echo $?
bash: [: missing `]'
2
위 명령에서 0은 참, 1은 거짓, 2는 오류를 의미합니다.
답변2
내가 댓글에서 말했듯이, 귀하의 질문은 실제로
테스트를
find
만족하는지 확인하기 위해 명령을 사용하여 단일 파일을 테스트하려면 어떻게 해야 합니까 ?find
size
여기서 파일 이름은 스크립트에 대한 인수로 지정됩니다(따라서 미리 알 수 없음). 명령을 중심으로 답변을 작성하고 있습니다.
if find . -name "$1" -size "$2"c | grep -q .
then
echo OK
fi
나는 dhag가 추천한 인용문을 자유롭게 삽입했습니다. 이것은 나쁜 시작은 아니지만 몇 가지 문제가 있습니다.
- 사용자가 인수를 사용하여 스크립트를 실행
test.txt
하고 다음과 같은 스크립트가 있는 경우test.txt
현재 디렉토리의 하위 디렉토리,find
그런 다음 이를 찾아 경로 이름을 인쇄하면grep
성공합니다. 그러나 스크립트가test.txt
현재 디렉터리에 호출된 파일을 사용하여 작업을 시도하면 해당 파일이 없기 때문에 실패합니다. 하위 디렉터리를 찾지 못하도록
추가하면 이 문제를 해결할 수 있습니다 .-maxdepth 1
find
- 사용자가 인수를 사용하여 스크립트를 실행하면
my_subdir/test.txt
인수 에 슬래시가 포함되지 않을 수 있으므로find
실패합니다-name
. - 매우 장난꾸러기 사용자가 있다면 그 사용자는
"*"
단지 문제를 일으키기 위해 타이핑을 하고 있을 수도 있습니다.
find .
실제로 디렉토리 트리를 검색하고 싶지 않을 때 사용하는 것은 약간 어리석은 것 같습니다. 파일 이름을 알고 있으면 해당 속성을 테스트할 수 있습니다. 글쎄, 만약 당신이 한쪽 눈을 감고 이 책의 줄 사이를 읽어본다면 find(1)
, 당신은 그것이 실제로는 결코 말하지 않는다는 것을 깨닫게 될 것입니다.길인수는 디렉토리여야 합니다. 이는 단지 디렉토리임을 의미할 뿐입니다. 당신이 말할 수 있다는 것이 밝혀졌습니다
찾다 파일 이름 [표현하다]
문제에 적용하면 다음과 같습니다.
find "$1" -size "$2"c
온전한 상태를 확인하기 위해 다음을 제안합니다.
if [ -f "$1" ] && find "$1" -size "$2"c | grep -q .
then
echo OK
fi
지정된 파일이 전혀 존재하지 않는 경우 오류 메시지를 받는 것을 방지하기 위해 find
(그리고 위에서 언급한 장난스러운 사용자가 스크립트에 디렉터리 이름을 제공하는 것을 방지하기 위해)
답변3
다른 곳에서 제공되는 솔루션과 비슷 grep
하지만 더 간단할 수도 있습니다. 간단히 read
종료 하면 됩니다 find
.find
( read
확실히 그럴 테니까)첫 번째 게임에서는 확실한 반환 값을 제공합니다.
find . -name test.txt -size 156c |
read -r na && echo ok || ! echo shite
...잘 작동할 겁니다. 무엇이든 인쇄 하면 find
후행 줄바꿈이 있으므로 read
단일 일치라도 true 를 반환합니다 find
. 그러나 find
아무것도 인쇄 하지 않으면 read
줄바꿈을 읽기 전에 도착하므로 오류가 반환됩니다.EOF
\n