사용자가 디렉토리 이름을 입력할 때마다 이 오류를 표시하는 스크립트가 있습니다.
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 message
variable