특정 확장명을 가진 파일을 재귀적으로 찾습니다.
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"
- 이 있습니다.
{
뒤에 .browsefolders ()
- 든모.
$in
야 .$suffix
- 줄
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
'source' 카테고리의 다른 글
Swift의 UIActivityViewController로 텍스트 또는 이미지를 공유하기 위한 기본 예제 (0) | 2023.04.29 |
---|---|
데이터베이스 설계:계정 잔액 계산 (0) | 2023.04.29 |
기본 설정을 강조하는 Eclipse 구문 저장 및 복원 (0) | 2023.04.29 |
스프링 보안 부서의 "주임"은 무엇입니까? (0) | 2023.04.29 |
윈도우즈 10의 NVM에서 액세스 거부 문제 (0) | 2023.04.29 |