Bash 스크립트에서 찾기를 사용하지 않고 일치하는 파일을 검색하려면 와일드카드를 사용하세요.

Bash 스크립트에서 찾기를 사용하지 않고 일치하는 파일을 검색하려면 와일드카드를 사용하세요.

find과제를 위해 실제로 명령을 사용하지 않고 매우 기본적인 bash 스크립트 역할을 하는 bash 스크립트를 작성해야 합니다 find. 예를 들어, 다음과 같이 입력하면:

my_find ~/homedir/ -name 'test*' -name '*.o' -type f

~/homedir/와일드카드 이름과 일치하는 항목을 검색한 다음 해당 결과 내에서 이름과 일치하는 항목을 검색하고 마지막으로 (아마도 중복될 수 있음) 파일을 검색하는 데 필요합니다 . 마지막으로 모든 결과가 나열됩니다.test*AND*.o

dirpath=$1지금까지 디렉터리 경로( )를 저장하는 변수를 만들었습니다 . 그런 다음 이를 사용하여 shift첫 번째 인수를 제거하고 다음을 수행합니다(참고, -type아직 구현되지 않음).

while (($#)); do
    if [[ $1 == "-name" ]]; then
        # process the name here?
        shift 2 # get rid of -name "name"
    fi
done

이걸 어떻게 만드는지, 아니면 어떻게 하는지 궁금합니다. 디렉터리 경로를 통해 반복되는 부분적으로 완료된 함수가 있지만 전달된 인수를 처리하는 방법/위치를 잘 모르겠습니다. 이는 각 디렉터리를 살펴보는 재귀 함수입니다.

recurse_path () {
    for i in "$@"; do
        # process and store matching file names in the array?
        if [[ -d "${i}" ]]; then
            cd "${i}"
            recurse_path *
        fi
    done
}

그렇다면 이 기능을 사용할 때 일치하는 파일 이름을 검색하고 결과를 배열에 저장하려면 어떻게 해야 합니까? 또한 이것이 올바른 방법입니까, 아니면 각 명령을 볼 때 얻은 결과를 업데이트하는 더 쉬운 방법이 있습니까? 저는 bash 스크립팅을 처음 접했기 때문에 조언을 주시면 감사하겠습니다.

답변1

기본적인 것을 주문해 보겠습니다.

1.

이미 디렉토리 트리를 탐색할 수 있다면 다음 단계는 현재 방문한 디렉토리 내에서 검색하는 것입니다. 지원하려는 패턴 구문 스타일에 따라 다릅니다. 정규식은 완전히 다른 것입니다. 어쩌면 우리는 쉘의 내장 패턴 구문에 만족할 수도 있습니다. 그럼 그게 다야.

for i in * ; do for p in <patterns> ; do
        if [[ $i == $p ]]
        ...
        fi
done ; done

2.

명령줄을 구문 분석하려면 bash에 getopt가 내장되어 있습니다. 매뉴얼을 참조하세요.

삼.

배열의 경우 설명서를 참조하세요.

답변2

더티 솔루션은 다음과 같습니다.

boolRememberNext=0
rememberString=""

for arg in $*; do
   if [ ${boolRememberNext} -eq 1 ]; then
      rememberString="${rememberString} ${arg}"
   fi
   if [ "${arg}" = "-name" ]; then
      boolRememberNext=1
   else
      boolRememberNext=0
   fi
done

echo ${rememberString} | while read filemask; do
   unquotedFile=$(echo "$filemask" | tr -d "'")
   ls -R1 ~/homedir/ | grep ":" | cut -d: -f1 | while read dir; do
      ls ${dir}/unquotedFile
   done
done

왜 더러운가요?

  • 루프가 많아 파일 시스템에 여러 번 액세스함
  • 잘못된 명령줄 구문 무시
  • 디렉터리 및 파일 이름에는 다음이 포함될 수 없습니다.
  • tr을 사용하여 var를 역참조하면 * 조합이 처리되지 않습니다.
    이에 대해서는 eval을 사용하고 싶지 않습니다.

솔루션을 개선하기 위해 어떤 조치를 취할 수 있습니까?

중간 결과를 로컬 변수에 저장하고, 특수 문자 처리를 개선하고, 구문을 확인할 수 있습니다.

또한 ls ~/homedir/*파일을 찾을 수 없을 때까지 검색 경로에 별표를 추가할 수도 있습니다. 일부 필터(awk?)를 통해 모든 파일을 구문 분석합니다. 찾은 파일을 확인하세요. 디렉터리가 아닌 파일입니다.

관련 정보