해당 파일 이름에 있는 모든 파일을 검색하고 인쇄하기 위해 파일 이름을 묻는 스크립트를 작성하는 방법

해당 파일 이름에 있는 모든 파일을 검색하고 인쇄하기 위해 파일 이름을 묻는 스크립트를 작성하는 방법

사용자에게 파일 이름을 묻는 메시지를 표시한 다음 해당 파일 이름을 가진 시스템의 모든 파일을 인쇄하는 스크립트를 작성해야 합니다. 지금까지 내 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"

이 스크립트가 없으면 설정 failglobglobstar셸 옵션을 bash사용하여 명령줄에서 직접 스크립트와 동일한 작업을 효과적으로 수행할 수 있습니다.

$ shopt -s globstar failglob dotglob
$ echo ./**/.zsh
./.zsh
$ echo ./**/.zshrc
./.zsh/.zshrc ./skel/.zshrc
$ echo ./**/booo
bash: no match: ./**/booo

관련 정보