나는 하나의 인수(디렉토리 이름)를 허용하고 해당 디렉토리에 있는 파일, 디렉토리, 읽기 가능한 파일, 쓰기 가능한 파일 및 실행 파일 수를 표시하는 쉘 스크립트를 작성 중입니다. 인수 없이 실행하면 오류 메시지가 표시되고 중단됩니다. 또한 지정된 매개변수가 존재하지 않으면 오류 메시지를 표시하고 중단해야 합니다. 그렇지 않으면 위의 정보가 표시되어야 합니다. 나는 평생 동안 그것을 작동시킬 수 없습니다. 이게 제가 가지고 있는 것입니다. 도와주세요! :
#!/bin/csh
$1
set file=$1
if ($file==0)then
echo "usage: assignment6.sh <directory_name>"
exit0
else
if (-e $file && -r $file) then
echo "Number of Directories: `ls | wc -w`"
echo "Number of Files: `ls -d */ | wc -w`"
echo "Number of Readable files: `find * -type f -or -type d -maxdepth 0 -perm +u=r | wc -w`"
echo "Number of Writable files: `find * -type f -or -type d -maxdepth 0 -perm +u=w | wc -w`"
echo "Number of Executable files: `find * -type f -or -type d -maxdepth 0 -perm +u=x | wc -w`"
else
if (! -e $file) echo "No such directory."
exit 0
endif
endif
exit 0
답변1
이 스크립트의 문제점:
- 구문 분석 중인 출력입니다
ls
. 구문 분석되지 않았습니다ls
. - 공백이 포함되지 않은 파일 이름을 사용하고 있습니다.또는 개행 문자. 여기에는 어느 것이든 포함될 수 있습니다.
- 당신은
csh
모든 것을 자체적으로 사용하고 있습니다.이는 쉘 스크립트에 있어서 좋지 않은 생각입니다. Bash, Ksh, Zsh, 거의아무것그러나 이것이csh
더 나은 생각입니다. (제 생각이지만, 링크된 사실 추론을 주의 깊게 읽어보시기 바랍니다.)
이는 프로그램의 이 부분에 대한 POSIX 호환 버전입니다. (나중에 시간이 나면 나머지 기능도 포함할 수 있습니다.)
이는 인수 목록보다 더 많은 파일이 있는 경우를 처리하지 않지만 다음을 수행하도록 수정할 수 있습니다.진짜필요한.
#!/bin/sh
[ "$#" -eq 1 ] && [ -d "$1" ] || {
printf 'Usage:\t%s <directory>\n' "$0"
exit 1
}
dirs="$(find "$1" -path '*/*/*' -prune -o -type d -exec sh -c 'printf %s\\n "$#"' sh {} +)"
files="$(find "$1" -path '*/*/*' -prune -o -type f -exec sh -c 'printf %s\\n "$#"' sh {} +)"
printf 'Number of directories in %s:\t%s\n' "$1" "$dirs"
printf 'Number of files in %s:\t%s\n' "$1" "$files"
-maxdepth
기본 장치는 휴대용이 아니기 때문에 여기에 설명된 기술을 사용했습니다.