좋아, 기본적으로 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
이는 발견된 파일 배치에 대한 짧은 인라인 쉘 스크립트를 호출합니다. 스크립트는 -s
test를 사용하여 각 경로 이름을 테스트하여 비어 있는지 확인하고, 그렇다면( -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