현재 디렉토리의 파일이 8줄을 초과할 때마다 증가되는 쉘 스크립트에서 카운터를 생성하는 방법과 두 개의 목록(하나는 8줄을 초과하는 파일을 포함하고 다른 하나는 8줄을 초과하는 파일을 포함)을 생성하는 방법 라인. 8줄 미만의 다른 파일이 있나요? 나는 이것을 시도했지만 그것이 틀렸다고 확신합니다.
contor=0
while [ contor -le 100 ]
do
echo $contor
contor=expr $contor + 1
done
답변1
#!/bin/bash
shopt -s nullglob dotglob
long_files=()
short_files=()
for name in ./*; do
[[ ! -f $name ]] && continue
numlines=$( wc -l <"$name" )
if [[ numlines -gt 8 ]]; then
long_files+=( "$name" )
elif [[ numlines -lt 8 ]]; then
short_files+=( "$name" )
fi
done
printf 'There are %d files with more than 8 lines:\n' "${#long_files[@]}"
printf '\t%s\n' "${long_files[@]}"
printf 'There are %d files with less than 8 lines:\n' "${#short_files[@]}"
printf '\t%s\n' "${short_files[@]}"
이것은 실제로 파일에 8줄보다 많거나 적은지 여부에 따라 현재 디렉터리의 모든 이름을 반복하고 이름을 두 개의 목록(배열) long_files
과 으로 분할하여 요청한 작업을 수행합니다 . short_files
정확히 8줄의 파일은 목록에 저장되지 않습니다. -f
테스트 및 명령문은 비전통적인 파일(예: 디렉터리 등)에 해당하는 이름을 건너뜁니다 continue
.
줄 수는 를 사용하여 계산되므로 wc -l
파일의 개별 줄을 계산하기 위해 카운터를 사용할 필요가 없습니다.
이 스크립트 설정 nullglob
과 dotglob
셸 옵션을 사용하면 완전히 비어 있는 디렉터리와 숨겨진 파일을 올바르게 처리할 수 있습니다.
마지막으로 두 개의 목록이 출력됩니다.
테스트 실행:
$ bash script.sh
There are 1 files with more than 8 lines:
./script.sh
There are 3 files with less than 8 lines:
./.bash_profile
./.bashrc
./.zshrc
목록이 포함된 두 개의 파일을 만들려면 위 스크립트의 끝 부분에 있는 파일에 목록을 인쇄하세요.
printf '%s\n' "${long_files[@]}" >long_files.list
printf '%s\n' "${short_files[@]}" >short_files.list
또는 배열에 이름을 추가하는 대신 프로그램의 메인 루프에서 파일로 인쇄합니다.
#!/bin/bash
shopt -s nullglob dotglob
rm -f long_files.list short_files.list
for name in ./*; do
[[ ! -f $name ]] && continue
numlines=$( wc -l <"$name" )
if [[ numlines -gt 8 ]]; then
printf '%s\n' "$name" >>long_files.list
elif [[ numlines -lt 8 ]]; then
printf '%s\n' "$name" >>short_files.list
fi
done
도착하다계산8줄보다 긴 파일 수, 긴 파일이 감지될 때 증가하는 카운터 변수를 사용하거나, 길고 짧은 파일의 배열을 사용하는 경우 "${#long_files[@]}"
루프 뒤의 긴 파일 수를 가져옵니다(첫 번째 코드 조각에서처럼). ).