파일 수를 계산하는 Bash 스크립트


11

스크립트가 있는데 파일이 존재하는지 여부에 따라 다른 메시지를 표시하고 싶습니다. 나는 다음과 같은 스크립트를 가지고있다 :

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

그러나 파일이 없으면 No such file or directory0 파일 대신 표시 됩니다. 디렉토리에 /import/디렉토리가 있으므로 ls항상 0보다 큰 값을 반환하므로 명령을 수행 할 수 없습니다 .

특정 확장명 (.zip, .gz 등)의 파일 수를 계산하고 bash 스크립트에서 해당 값을 사용하여 파일 수를 표시 한 다음 if 문에서 사용하여 다른 메시지를 표시하려면 어떻게해야합니까?

답변:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
현재 디렉토리에있는 파일 만 계산하기 위해 -maxdepth 1을 추가했습니다
Wallace Sean

1
이 디렉토리가 호출 될 때 현재 디렉토리에 .zip 파일이있는 경우 '* .zip'을 인용하고 싶을 것입니다. (1).
Phil P

4

이것으로 시도하십시오 :

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

아이디어는 비트 버킷으로 전송하여 STDERR에 인쇄되는 "파일 없음"오류를 숨기고 숫자를 비교하기 위해 적절한 테스트 기능을 사용하는 것입니다. ( -gt"이상"을 의미합니다.도 있습니다 -eq, -lt, -ge, 등)


대안으로, 당신은 또한 할 수 있습니다count=$(find /import -type f -name "*.zip" | wc -l)
slillibri

그러나 ls /import/*.zip하위 디렉토리 가있는 경우 와는 다른 의미를 갖습니다.
Mat

하위 디렉토리에서 파일을 계산하지 않도록 maxdepth를 설정하고 -gt를 사용하도록 스크립트를 업데이트했습니다. 도움을 주셔서 감사합니다
Wallace Sean

디렉토리에 ls 호출을위한 argv에 맞지 않는 파일이 너무 많으면 실패합니다.
Phil P

아 맞아 find변형으로 수정되었습니다 .
Mat

0

스크립트를 시도했지만 예상대로 일치하는 파일이 없으면 출력에 0 개의 파일 표시되지만 ls직전 에 오류가 표시 됩니다. 이것을 해결하는 것은 매우 쉽습니다 ls. 도랑 할 필요가 없습니다 . 첫 번째 줄을 다음과 같이 바꾸십시오.

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/null/dev/null오류 메시지를 표시하지 않고 stderr을로 리디렉션 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.