변수가 포함된 명령 찾기

변수가 포함된 명령 찾기

나는 이것을하고 싶다 :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/diror로 끝나는 아래의 모든 이름과 일치합니다. 결과 배열이 정렬됩니다..avi.mkv


find이는 찾은 이름으로 작업을 수행해야 하거나 특정 파일 형식 테스트를 통합해야 하는 경우 유용합니다. 예를 들어, 일치하는 항목만 확인해야 하는 경우일반 파일, 사용

find /path/to/dir -type f \( -name '*.avi' -o -name '*.mkv' \)

두 개의 파일 이름 접미사 avimkv배열 이름이 주어 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 {} +

자세한 내용은 다음을 참조하세요.

관련 정보