인수로 파일 일치 순서를 반대로 바꿉니다.

인수로 파일 일치 순서를 반대로 바꿉니다.

특정 순서로 파일을 읽는 프로그램이 있습니다. 이 예에서는 둘 다 동일한 확장자 txt를 갖습니다.

{program_name} {input 1...} {output}

출력 파일 이름을 "a.txt"로 지정했기 때문에 이를 호출했을 때 첫 번째 결과가 되었으며 ls, 이는 이 명령에 대한 파일 입력 순서를 보여줍니다.

{program_name} *.txt

첫 번째 결과가 마지막 결과로 나타나기를 원합니다. 별 매칭 순서를 바꾸는 방법은 무엇입니까? 파이프를 사용해야 하는 경우 특수 문자나 공백이 올바르게 인용되도록 매개변수를 올바르게 입력하는 구문은 무엇입니까?

답변1

사용 zsh:

zsh -c 'program *.txt(.^on)'

는 패턴에 대한 수정자 (.^on)이므로 일반 파일( )과만 일치하고 결과 목록은 역순( )으로 정렬( )됩니다.zsh*.txt.o^n

그러면 생성된 파일 이름 목록을 명령줄 인수로 사용하여 실행되는 비대화형 zsh셸이 시작됩니다. program이 명령은 파일 이름에 공백이나 줄 바꿈 등이 포함되어 있어도 역방향 인수 목록을 올바르게 처리합니다.

예:

$ touch {a..d}.txt
$ echo *.txt
a.txt b.txt c.txt d.txt
$ zsh -c 'echo *.txt(.^on)'
d.txt c.txt b.txt a.txt

zsh솔루션:

set --
for fname in *.txt; do
    set -- "$fname" "$@"
done

program "$@"

또는 예를 들어 명명된 배열을 사용합니다 bash.

args=()
for fname in *.txt; do
    args=( "$fname" "${args[@]}" )
done

program "${args[@]}"

두 코드 조각 모두 *.txt패턴과 일치하는 이름을 기반으로 배열이 구성됩니다. 각 이름은 배열 앞쪽으로 푸시되므로 배열은 성이 먼저 끝나는 효과가 있습니다.

첫 번째 경우에는 위치 인수 목록을 배열로 사용합니다. 이 코드는 sh유사한 셸에서 작동해야 합니다.


프로그램의 인수 목록에서 마지막 이름만 필요하고 확장 순서대로 다른 이름을 가질 수 있는 경우 다음 코드가 sh유사한 셸에서 트릭을 수행합니다.

set -- *.txt
fname=$1
shift
program "$@" "$fname"

또는 bash특정 구문과 명명된 배열을 사용하여

args=( *.txt )
program "${args[@]:1}" "${args[0]}"

"${args[@]:1}"element 에서 시작하는 args배열의 모든 요소(개별적으로 인용됨) 로 확장됩니다 1.

다시 테스트하세요 echo:

$ args=( *.txt )
$ echo "${args[@]:1}" "${args[0]}"
b.txt c.txt d.txt a.txt

관련 정보