나는 이것을하고 싶다 :readarray var1 < <(find "/path/to/dir" \( $var2 \) | sort)
echo $var2
user@domain:~# -name "*.avi" -o -name "*.mkv"
불행히도 내 스크립트가 작동하지 않습니다. 내가 어디에서 잘못되고 있는지 말해주세요.
답변1
배열을 사용하십시오:
var2=( -name "*.avi" -o -name "*.mkv" )
readarray var1 < <(find "/path/to/dir" \( "${var2[@]}" \) | sort)
관련 내용을 살펴보세요.변수에 저장된 명령을 어떻게 실행할 수 있나요?
답변2
경로 아래의 모든 이름을 /path/to/dir
정렬된 목록으로 가져오려면 다음을 수행하십시오 bash
.
shopt -s globstar nullglob dotglob
names=( /path/to/dir/** )
globstar
의 쉘 옵션은 경로명처럼 작동 하지만 경로명 내에서 일치하는 glob bash
의 사용을 허용합니다 ( 즉, 하위 디렉토리에서 "재귀적으로" 일치함). shell 옵션을 사용하면 shell glob이 수행하는 경우**
*
/
nullglob
아니요임의의 이름과 일치하면 완전히 제거됩니다(기본값은 패턴을 확장하지 않은 채로 두는 것입니다). 이 dotglob
옵션을 사용하면 기본적으로 숨겨진 파일 이름이 일치하게 됩니다.
sort
쉘 glob의 결과 확장은 의 기본 출력과 마찬가지로 사전순으로 정렬되므로 이름을 파이프 할 필요가 없습니다 .sort
.avi
.mkv
파일 이름 접미사를 사용하여 이름을 얻으려면
shopt -s globstar nullglob dotglob extglob
names=( /path/to/dir/**/*.@(avi|mkv) )
extglob
여기에 확장된 글로빙 패턴을 사용할 수 있는 셸 옵션을 추가했습니다 . 패턴은 @(avi|mkv)
"또는 avi
"을 의미하므로 mkv
전체 패턴은 /path/to/dir
or로 끝나는 아래의 모든 이름과 일치합니다. 결과 배열이 정렬됩니다..avi
.mkv
find
이는 찾은 이름으로 작업을 수행해야 하거나 특정 파일 형식 테스트를 통합해야 하는 경우 유용합니다. 예를 들어, 일치하는 항목만 확인해야 하는 경우일반 파일, 사용
find /path/to/dir -type f \( -name '*.avi' -o -name '*.mkv' \)
두 개의 파일 이름 접미사 avi
와 mkv
배열 이름이 주어 suffix
지면 -name
테스트를 배열로 구성할 수 있습니다.
suffix=( avi mkv )
nametest=( -false ) # assumes GNU find here
for suf in "${suffix[@]}"; do
nametest+=( -o -name ".$suf" )
done
find /path/to/dir -type f \( "${nametest[@]}" \)
저축은 거의 정확하지 않습니다산출정말로 원할 때 find
변수 에일하다이름을 찾으려고. 대신 다음을 사용하십시오 -exec
.
find /path/to/dir -type f \( "${nametest[@]}" \) -exec sh -c '
for pathname do
# do something with "$pathname" here
done' sh {} +
자세한 내용은 다음을 참조하세요.
- "find"의 -exec 옵션 이해
- 찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?
- 그 외 많은 질문과 답변찾다이 웹사이트에서.