"wc"에서 "해당 파일이나 디렉터리가 없습니다" 메시지를 억제합니다.

"wc"에서 "해당 파일이나 디렉터리가 없습니다" 메시지를 억제합니다.

사용자가 디렉토리 이름을 입력할 때마다 이 오류를 표시하는 스크립트가 있습니다. wc: standard input: is a director 사용자가 디렉토리에 들어갈 때 오류 메시지를 표시하지 않고 이를 무시하도록 하는 방법이 필요합니다.

Limit="$1"
if [ -z "$1" ]; then
   echo 'no Arrgument'> err.log;
   exit 0 
fi
shift 1
for file in "$@"; do 
   SIZE="$(wc -c < "$file")"
   if [ "$SIZE" -gt "$Limiit" ]; then 
       echo "$file is $SIZE bytes. Deleting.."; 
       rm $file
   else
       echo " files is smaller then the Limte  delete"
   fi
done

답변1

호출하기 전에 wc -c바이트 수를 셉니다 $file(여기서잠재적으로구현이 매우 스마트하지 않은 한(Linux의 경우) 파일 크기를 가져오는 방법은 매우 느릴 수 있습니다. stat -L -c %s "$file"대신 전체 파일을 읽을 필요가 없는지 확인하고 사용하는 것이 좋습니다. 일반 파일이고, 그렇지 않으면 건너뜁니다.

[[ ! -f $file ]] && continue

테스트는 -f다음과 같습니다.진짜파일이 일반 파일이거나 일반 파일에 대한 심볼릭 링크인 경우. 전체 테스트가 참이면(파일이 일반 파일이나 라인이 아님) 테스트가 무효화되고 !명령문이 실행되어 루프의 다음 반복으로 점프됩니다.continue


참고하시기 바랍니다필요$file호출 시 큰따옴표를 사용하십시오 rm. 그렇지 않으면 주어진 인수에 공백, 탭 또는 줄 바꿈이 포함된 경우 스크립트가 잘못 작동합니다. 또한 파일 이름에 파일 이름 와일드카드가 포함된 경우(예: 파일 이름 이름이 ) *의도한 것보다 더 많은 것을 제거합니다 .

--또한 이름이 대시로 시작하는 파일을 성공적으로 삭제하려면 매개변수 앞에 를 사용해야 합니다 .

rm -- "$file"

또한 shift단일 매개변수 의 경우 shift.

exit 1오류와 함께 종료됩니다 . stderr로 인쇄 >&2한 다음( 를 사용하여) 스크립트가 호출될 때 스크립트 오류 출력을 오류 로그로 리디렉션할 수 있는데 여기서 로그 파일로 인쇄할 수 있는 이유는 명확하지 않습니다 .


스크립트를 구현하는 또 다른 방법:

#!/bin/sh

sz=${1:?Error: size is missing}
shift

[ "$#" -gt 0 ] && find -L "$@" -maxdepth 0 -type f -size +"$sz"c -delete

find이는 매개변수를 테스트하여 해당 파일이 특정 크기보다 큰 일반 파일인지 확인하고 그렇다면 삭제하는 데 사용됩니다 . 이 -maxdepth 0테스트는 find명령이 검색 경로 자체만 고려하는 것을 방지합니다(디렉토리로 드롭다운하지 않음).

누락된 크기 매개변수에 대한 오류 메시지는 표준 매개변수 대체에 의해 처리되며, 주어진 값이 비어 있거나 설정되지 않은 경우 ${variable:?error message}스크립트가 종료됩니다 .error messagevariable

관련 정보