source

특정 확장명을 가진 파일을 재귀적으로 찾습니다.

factcode 2023. 4. 29. 09:55
반응형

특정 확장명을 가진 파일을 재귀적으로 찾습니다.

Bash(Ubuntu 10.04 LTS(Lucid Lynx) 릴리스)를 사용하여 디렉터리와 하위 디렉터리에서 특정 확장자를 가진 모든 파일을 찾으려고 합니다.

스크립트 파일에 기록된 내용은 다음과 같습니다.

#!/bin/bash

directory="/home/flip/Desktop"
suffix="in"

browsefolders ()
  for i in "$1"/*;
  do
    echo "dir :$directory"
    echo "filename: $i"
    #    echo ${i#*.}
    extension=`echo "$i" | cut -d'.' -f2`
    echo "Erweiterung $extension"
    if     [ -f "$i" ]; then

        if [ $extension == $suffix ]; then
            echo "$i ends with $in"

        else
            echo "$i does NOT end with $in"
        fi
    elif [ -d "$i" ]; then
    browsefolders "$i"
    fi
  done
}
browsefolders  "$directory"

안타깝게도 터미널에서 이 스크립트를 시작하면 다음과 같이 표시됩니다.

[: 29: in: unexpected operator

(와 함께)$extension대신에'in')

여기서 무슨 일이 일어나고 있고, 어디서 오류가 났습니까?그런데 이 꼬불꼬불한 팔찌.

find "$directory" -type f -name "*.in"

그 모든 것보다 약간 짧습니다 (그리고 더 안전합니다).파일 이름 및 디렉토리 이름의 공백을 처리합니다.

스크립트가 다음을 포함하지 않는 항목에 대해 실패했을 수 있습니다..그들의 이름으로, 만들기$extension빈.

find {directory} -type f -name '*.extension'

예:모두 찾기csv현재 디렉터리 및 하위 디렉터리의 파일은 다음을 사용합니다.

find . -type f -name '*.csv'

제가 사용하는 구문은 매트가 제안한 구문과 조금 다릅니다.

find $directory -type f -name \*.in

(키 입력이 하나 줄어듭니다.)

찾기를 사용하지 않는 경우:

du -a $directory | awk '{print $2}' | grep '\.in$'

사용하지만find명령은 여기서 유용할 수 있습니다. 셸 자체는 타사 도구 없이도 이 요구 사항을 충족할 수 있는 옵션을 제공합니다.bash셸은 원하는 확장자와 일치하는 파일 이름을 재귀 경로로 가져올 수 있는 확장 글로벌 지원 옵션을 제공합니다.

확장 옵션은 다음과 같습니다.extglob다음을 사용하여 설정해야 합니다.shopt아래와 같은 옵션.옵션은 에서 사용할 수 있습니다.-s그와 함께 장애가 있는 지지자들.-u플래그. 추가로 몇 가지 옵션을 더 사용할 수 있습니다. nullglob비길 데 없는 글러브를 0단어 집합으로 대체하여 완전히 쓸어버리는 것입니다.그리고.globstar모든 디렉토리를 다시 검색할 수 있습니다.

shopt -s extglob nullglob globstar

이제 글로벌 표현식을 구성하여 아래와 같이 특정 확장자의 파일을 포함하기만 하면 됩니다.배열을 사용하여 글로벌 결과를 채웁니다. 적절하게 인용하고 확장하면 특수 문자가 포함된 파일 이름이 그대로 유지되고 셸에 의한 단어 분할로 인해 손상되지 않기 때문입니다.

예를 들어 모든 항목을 나열합니다.*.csv재귀 경로에 있는 파일

fileList=(**/*.csv)

옵션**하위 폴더를 통해 반복됩니다.*.csv언급된 확장명의 모든 파일을 포함하도록 글로벌 확장명입니다.이제 실제 파일을 인쇄하려면 다음을 수행합니다.

printf '%s\n' "${fileList[@]}"

셸 스크립트에서 사용할 때는 어레이를 사용하고 적절한 따옴표로 묶은 확장을 수행하는 것이 올바른 방법이지만 대화형 사용을 위해서는ls을 세계는적표로으현으로 하여.

ls -1 -- **/*.csv

즉 다중 확장자로 될 수 , , ▁in▁flags▁multiple▁this▁▁to▁ending▁very▁(▁with).find명령).예를 들어 모든 재귀 이미지 파일(예: 확장자)을 가져와야 하는 경우를 생각해 보십시오.*.gif,*.png그리고.*.jpg은 신이필요당것은한당▁you입니다.

ls -1 -- **/+(*.jpg|*.gif|*.png)

이것은 또한 부정적인 결과를 갖도록 확장될 수 있습니다.동일한 구문으로 글로벌 결과를 사용하여 특정 유형의 파일을 제외할 수 있습니다.위의 확장자를 가진 파일 이름을 제외하고 싶다고 가정해 보겠습니다.

excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"

공사!()를 포함하지 않는 negate 작업입니다.|는 확장 정규식 라이브러리에서 글로브의 OR 일치를 수행하는 데 사용되는 것과 같은 대체 연산자입니다.

본할 수 POSIX 본 됩니다.bash 및 "POSIX"에서하고 있다면,bash이 않을 것입니다.", 이옵은올바지않을것입니다셸르션▁shells것다니.

사용:

find "$PWD" -type f -name "*.in"
  1. 이 있습니다.{ 뒤에 .browsefolders ()
  2. 든모.$in야 .$suffix
  3. cut의 중간 부분만 얻을 수 있습니다.front.middle.extension당신은 당신의 셸 매뉴얼을 읽어봐야 합니다.${varname%%pattern}그리고 친구들.

셸 스크립팅 이고, 않으면 셸 스크립팅 으로 하는 것으로 합니다.find이미 제안된 솔루션이 최선의 방법입니다.

셸 구문을 하려면 스립트를실않지올고셸다다사확니용음합을을 사용합니다.sh -n scriptname.

모든것찾면을 찾기 위해pom.xml현재 디렉터리에 있는 파일을 인쇄하면 다음을 사용할 수 있습니다.

find . -name 'pom.xml' -print
for file in "${LOCATION_VAR}"/*.zip
do
  echo "$file"
done 

사용:

find $directory -type f -name "*.in" | grep $substring

언급URL : https://stackoverflow.com/questions/5927369/recursively-look-for-files-with-a-specific-extension

반응형