우선, 저는 여기에 처음 왔기 때문에 길이가 길어서 죄송합니다. 하지만 포럼 규칙에는 세부 사항이 필요합니다.
죄송합니다. 이상하게 인쇄됩니다.
내가 하고 싶은 일은 다음과 같습니다. (B) 부분에서 막혔습니다.
생성한 스크립트는 코드의 모든 경로에 대해 상대 경로만 사용해야 합니다. 스크립트가 ~ 디렉터리에서 실행된다고 가정해야 합니다.
(A) "읽기" 내장 명령을 사용하여 사용자가 지정한 디렉터리의 모든 항목을 반복하는 쉘 스크립트를 만듭니다. 스크립트는 입력의 유효성을 검사하고 루프를 사용하여 유효성 검사가 완료된 후에만 스크립트가 계속되도록 허용해야 합니다. 주어진 디렉터리가 디렉터리인지 확인해야 합니다.
(B) 스크립트가 디렉터리의 항목을 반복할 때 항목을 테스트하여 해당 항목이 디렉터리인지 파일인지 확인해야 합니다.
(B.1) 디렉토리인 경우 스크립트는 디렉토리를 반복하고 그 안에 있는 항목 수를 계산해야 합니다(재귀적이지 않음). 이 스크립트는 디렉터리 이름과 그 안에 있는 파일(및 폴더) 수를 "~/sorter/directory_listing.txt"라는 파일의 동일한 줄에 출력해야 합니다.
(B.2) 파일인 경우 du 및 사람이 읽을 수 있는 출력을 사용하여 크기를 확인해야 합니다. 스크립트는 크기 뒤에 공백을 쓴 다음 "~/sorter/files_and_sizes.txt" 파일의 새 줄에 파일 이름을 써야 합니다.
(C) 루프가 완료된 후 files_and_sizes.txt 파일을 사람이 읽을 수 있도록 정렬한 다음 ~/sorter/files_sorted.txt 파일로 출력해야 합니다. Directory_listing.txt 파일은 파일 수만큼 역순으로 정렬되어야 합니다. 항목을 디렉토리에 저장하고 ~라는 파일로 출력합니다. /sorter/dir_reverse.txt 파일
내 시도:
read -p "Please enter a directory " chosen_dir
while [[ ! -d "$chosen_dir" ]]
do
echo Please enter a valid directory && read chosen_dir
done
for i in $chosen_dir/*;
do
counter=$((counter+1))
if [ -d "$chosen_dir" ]; then
ls "$chosen_dir" | wc -l > sorter/directory_listing.txt
else
if [ -f "$chosen_dir" ]; then
du -sh "$chosen_dir"/* > sorter/files_and_sizes.txt
fi
done
결과:
blahblah@vm1:~$ ./taratest.sh
Please enter a directory testsort
./taratest.sh: line 26: syntax error near unexpected token `done'
./taratest.sh: line 26: ` done'
삭제하면 done
이런게 나오네요...
새로운 결과:
blahblah@vm1:~$ ./taratest.sh
Please enter a directory testsort
./taratest.sh: line 27: syntax error: unexpected end of file
그런 다음: 디렉터리를 반복하면서 항목이 bash의 파일인지 디렉터리인지 테스트하면서 여기에서 검색합니다.
다음과 같이 변경되었습니다.
스크립트의 첫 번째 부분은 다음과 같습니다.
for i in "$chosen_dir"/*
do
[ -f "$chosen_dir" ] && echo "is File"
[ -d "$chosen_dir" ] && echo "is Directory"
done
나는 출력이 지침에 있는 것과 다르다는 것을 알고 있습니다. 테스트 목적으로만 에코하는 것입니다.
결과:
Please enter a directory testsort
is Directory
is Directory
is Directory
is Directory
2개는 파일이고 2개는 디렉터리입니다. 왜 4개의 디렉터리라고 합니까?
blahblah@vm1:~$ ls -lh testsort
total 8.0K
drwxrwxrwx 2 blahblah student 68 Jun 4 17:41 dir1
drwxrwxrwx 2 blahblah student 68 Jun 4 17:41 dir2
-rwxrwxrwx 1 blahblah student 0 Jun 4 17:41 file1.txt
-rwxrwxrwx 1 blahblah student 0 Jun 4 17:41 file2.txt
솔루션에 대한 안내를 주시면 감사하겠습니다.
답변1
문제는 다음과 같은 구성이 있다는 것입니다.
for [stuff]; do
if [test]; then
[stuff]
else
if [test]; then
stuff
fi
done
두 개의 중첩된 항목이 있습니다 if
. 괜찮지만 그 중 하나만 종료할 수 있습니다 fi
. 다음 중 하나를 수행해야 합니다.
# Alternative one:
for [stuff]; do
if [test]; then
[stuff]
else
if [test]; then
stuff
fi
fi
done
# Alternative two
for [stuff]; do
if [test]; then
[stuff]
elif [test]; then
stuff
fi
done
답변2
또 다른 문제는 테스트 변수를 사용할 때 변수를 (올바르게) 참조 하지만 루프에서 참조 -d
하지 못한다는 것입니다 .for
바꾸다:
for i in $chosen_dir/*;
do
사용:
for f in "$chosen_dir"/*; do
(이름 변경과 공백 변경은 스타일 포인트입니다. 추가된 큰따옴표가 중요합니다.)
카운터를 실제로 사용한 적이 없기 때문에 카운터로 무엇을 하고 싶은지 모르겠습니다. 또한 위에 $i
제공된 $f
구성을 기반으로 for
."$chosen_dir"
그런데 이것을 숙제로 지정해 주셔서 감사합니다. 더 짧은 솔루션이 있을 수 있지만 구문 오류를 수정하고 괜찮다면 일반적인 접근 방식은 괜찮습니다.변수 참조.
하위 디렉터리의 파일 개수의 경우 사용하는 명령으로 정확한 개수를 얻지 못할 수 있습니다. (실제로는 그럴 것이다.안 돼요정확한 수를 얻으려면 명령을 사용하십시오. ls "$chosen_dir" | wc -l
하위 디렉토리가 아니라 사용자가 입력한 디렉토리를 테스트하기 때문입니다. ) 하위 디렉토리 내의 정확한 파일 수를 제공할 수 있도록 linecount ls
대신 사용을 고려할 수 있습니다 . ls -1 -A "$i"
( 및 플래그 man ls
에 대한 자세한 내용은 참고자료를 참조하세요 .)-1
-A
이것은 여전히 개행 문자가 포함된 파일 이름을 올바르게 처리하지 못하지만 숙제에 있어서 점수를 잃을 것이라는 점은 매우 의심스럽습니다. (실제로 프로덕션에서 사용되는 많은 스크립트는 개행 문자가 포함된 파일 이름에서도 실패합니다. 이러한 이름은 거의 전적으로 악의적인 사용자에게서 나온 것입니다.)
C 부분은 스스로 알아낼 수 있을 것 같아요. ;) ( 이 사이트에서 태그를 검색하여 필요한지 확인할 man sort
수도 있습니다 .)sort