find . | grep "B02_10m.tif$"
터미널에서 이 코드 조각을 실행하면 B02_10m.tif로 끝나는 모든 파일을 얻을 수 있습니다. 하지만 일부 처리를 위해 ac 파일에 대한 입력으로 이 목록이 필요합니다. 입력은 스크립트 매개변수의 일부로 전달되는 Linux 변수여야 합니다.
./avg outAVG $files
여기서 $files는 첫 번째 조각의 결과를 포함하는 변수입니다.
그게 가능합니까? 난 노력 했어:
files = $(find . | grep "B02_10m.tif$")
Command 'files' not found, did you mean:
command 'file2' from deb file-kanji
command 'file' from deb file
Try: sudo apt install <deb name>
그러나 그것은 작동하지 않았습니다.
답변1
bash
쉘을 사용한다고 가정합니다 .
shopt -s globstar nullglob dotglob
./avg outAVG ./**/*B02_10m.tif
avg
이것은 현재 디렉토리나 그 아래에 있는 파일 이름으로 프로그램을 호출합니다 . 먼저 글로빙 모드를 B02_10m.tif
활성화하여 이를 수행합니다 . 이 패턴은 "재귀적으로" 하위 디렉터리와 일치합니다. TIFF 파일이 있는 경우**
shopt -s globstar
현재의**
디렉토리에는 패턴의 이 부분이 필요하지 않습니다 .
다른 두 셸 옵션은 와일드카드 패턴이 숨겨진 이름과 일치하는지 확인하고 일치하는 항목이 없으면 find
.
zsh
쉘을 사용하는 경우 다음을 사용할 수 있습니다.
./avg outAVG ./**/*B02_10m.tif(.DN)
이것은 같은 일을 할 것입니다. 마찬가지로 TIFF 이미지가 저장된 디렉토리를 알고 있으면 **
모드 비트가 필요하지 않으며 대신 해당 디렉토리에 올바른 경로를 삽입할 수 있습니다.
유사한 셸 에서 sh
파일이 라는 디렉터리에 있으면 $dir
다음을 사용할 수 있습니다.
./avg outAVG "$dir"/*B02_10m.tif
이는 분명히 의 하위 디렉터리에 대한 재귀 검색을 수행하지 않습니다 $dir
.
귀하의 방법은 두 가지 이유로 작동하지 않습니다.
변수 할당에 구문 오류가 있습니다
files
.=
과제에는 주변 공백이 없어야 합니다.구문 오류를 수정하기 위해 여러 개별 파일 이름을 단일 문자열로 결합했습니다. 그렇게 하면 파일 이름에 일반적으로 쉘 와일드카드로 사용되는 공백과 문자가 포함될 가능성이 있다는 사실이 무시됩니다. 나중에 따옴표를 사용하지 않으면
$files
쉘은 문자열을 공백 문자(기본값)에서 여러 단어로 분할한 다음 쉘의 와일드카드 패턴처럼 보이는 모든 단어를 확장합니다. 항상 매우 간단한 파일 이름을 사용하지 않으면 코드가 오작동하게 됩니다.
이러한 문제에 대한 자세한 내용은 다음을 참조하세요.
- "찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?
find
"(어떤 내용이든 인쇄된 파일 이름 기준), - "공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?"(참조 변수와 관련) 및
- "왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?"( 사용과
ls
관련하여당신의 댓글 중 하나).
답변2
files1=`find . | grep "B02_10m.tif$"`
이것을 시도해 볼 수 있나요?