쉘 스크립트를 통해 크기 확인 및 파일 삭제

쉘 스크립트를 통해 크기 확인 및 파일 삭제

좋아, 기본적으로 MySQL에서 데이터를 가져와 CSV 파일로 저장한 다음 sftp를 사용하여 모든 파일을 다른 서버로 푸시하는 이와 같은 스크립트를 만들었습니다.

그래서 기본적으로 파일에 내용이 있는지 확인하는 이와 같은 스크립트를 만들고 싶습니다. 파일에 내용이 없으면 기본적으로 로그에 "파일에 내용이 없습니다"라고 기록하고 삭제하며, 로그에 "파일 삭제"를 추가합니다.

감사와 안부를 전합니다, Sagar

답변1

현재 디렉터리와 그 아래 디렉터리에서 빈 파일을 찾고 해당 경로를 다음이라는 텍스트 파일에 기록한다고 가정합니다 empty.txt.

find . ! -path ./empty.txt -type f -empty -print -delete >empty.txt

find이는 비표준 -empty및 옵션을 이해하는 구현이 있다고 가정합니다 -delete. 이 명령은 empty.txt로그인 중인 파일을 삭제하지 않습니다. 그렇지 않으면 해당 empty.txt파일에 대한 경로 이름을 출력하는 동안 빈 일반 파일을 찾아 삭제합니다.

아무것도 하지 않고 위의 명령을 실행하면 -print무엇이 삭제될지 확인할 수 있습니다.

표준 준수 변형의 경우:

find . ! -path ./empty.txt -type f -exec sh -c '
    for pathname do
        if [ ! -s "$pathname" ]; then
            printf "%s\n" "$pathname"
            rm -f "$pathname"
        fi
    done' sh {} + >empty.txt

이는 발견된 파일 배치에 대한 짧은 인라인 쉘 스크립트를 호출합니다. 스크립트는 -stest를 사용하여 각 경로 이름을 테스트하여 비어 있는지 확인하고, 그렇다면( -s테스트는진짜비어 있지 않은 경우(이것이 테스트를 무효화하는 이유입니다) 파일의 경로 이름을 인쇄하고 rm -f.

이전과 마찬가지로 이 출력은 empty.txt.

더 짧지만 덜 효율적인 표준 버전은 다음과 같습니다.

find . ! -path ./empty.txt -type f \
    ! -exec test -s {} \; -print -exec rm -f {} + >empty.txt

test이는 파일당 한 번씩 외부 명령을 실행하므로 효율성이 떨어집니다 .

답변2

명령은 wc -l파일의 줄 수를 계산합니다. 이것은 빌딩 블록이 될 수 있습니다.

lineCount=$(<$fileName wc -l)

if [ $lineCount -eq 0 ]; then
  echo "File $fileName has no content"
fi

관련 정보