사용자에게 파일 이름을 묻는 메시지를 표시한 다음 해당 파일 이름을 가진 시스템의 모든 파일을 인쇄하는 스크립트를 작성해야 합니다. 지금까지 내 script.sh에 다음이 있습니다.
#!/bin/bash
echo "please enter filename"
read filename
if [ find . -name $filename ] //not sure if the condition is right
then
//print all files on the system with that file name
not sure what to put here
else
echo "file does not exist"
fi
도와주세요, 감사합니다!
답변1
다음과 같은 것을 사용할 수 있습니다.
#!/bin/bash
echo "please enter filename"
read filename
find . -name "$filename" | egrep '.*'
if [ "$?" -ne 0 ]
then
echo "file does not exist"
fi
답변2
특정 이름을 가진 모든 파일 찾기를 사용하는 간단한 작업의 경우에는 bash
그럴 필요가 없습니다 . 이 유틸리티는 find
실제로 발견된 파일에 대해 작업을 수행해야 하는 상황에 find
더 유용합니다 .
쉘에는 하위 디렉토리를 "재귀적으로" 일치시키는 bash
특별한 **
패턴이 있습니다. 쉘 옵션을 설정하여 이 모드를 활성화하십시오 globstar
.
#!/bin/bash
shopt -s globstar dotglob nullglob
pathnames=( ./**/"$1" )
if [[ ${#pathnames[@]} -gt 0 ]]; then
printf 'Found "%s"\n' "${pathnames[@]}"
else
printf 'Found no file named "%s"\n' "$1"
fi
./**/"$1"
그러면 현재 디렉터리나 그 아래에 있는 스크립트의 첫 번째 명령줄 인수에 해당하는 모든 파일 이름과 일치하도록 패턴이 확장됩니다 . 생성된 경로 이름은 배열에 저장됩니다 pathnames
. 그런 다음 배열의 길이를 테스트하고 배열에 무언가가 포함되어 있으면(배열의 길이가 0보다 큼) 배열의 요소가 인쇄됩니다. 배열이 비어 있으면 메시지가 인쇄됩니다.
쉘 옵션을 사용 dotglob
하여 nullglob
쉘 와일드카드 패턴이 숨겨진 파일과 일치하는지 확인하고 패턴이 아무것도 일치하지 않으면 패턴이 완전히 제거됩니다.
이 스크립트(예: 시도 중인 코드)는 일반 파일, 디렉터리, 심볼릭 링크 또는 기타 유형의 파일을 구별하지 않습니다.
이 스크립트를 테스트하십시오.
$ bash ~/script.sh .zshrc
Found "./.zsh/.zshrc"
Found "./skel/.zshrc"
$ cd /etc
$ bash ~/script.sh .zshrc
Found no file named ".zshrc"
이 스크립트가 없으면 설정 failglob
및 globstar
셸 옵션을 bash
사용하여 명령줄에서 직접 스크립트와 동일한 작업을 효과적으로 수행할 수 있습니다.
$ shopt -s globstar failglob dotglob
$ echo ./**/.zsh
./.zsh
$ echo ./**/.zshrc
./.zsh/.zshrc ./skel/.zshrc
$ echo ./**/booo
bash: no match: ./**/booo