다음과 같은 파일 트리가 주어지면:
subdirFoo/2019-06-01-blah.ext
subdirFoo/2019-06-07-blah.ext
subdirFoo/2019-05-02-blah.ext
subdirBar/2019-06-03-blah.ext
subdirBar/2019-05-05-blah.ext
subdirBar/2019-05-13-blah.ext
이 파일을 반복하여 매개변수로 전달하고 싶지만 somecommand
전체 경로 대신 파일 이름별로 정렬된 순서로 반복하고 싶습니다.
일반적으로 glob은 알파벳순으로 정렬되지만 다음 순서로 정렬됩니다.
subdirBar/2019-05-05-blah.ext
subdirBar/2019-05-13-blah.ext
subdirBar/2019-06-03-blah.ext
subdirFoo/2019-05-02-blah.ext
subdirFoo/2019-06-01-blah.ext
subdirFoo/2019-06-07-blah.ext
즉, 정렬할 때 하위 디렉터리가 고려되는데 이는 내가 원하는 것이 아닙니다.
glob을 파일 이름으로만 정렬하면서 명령이 파일을 올바르게 참조할 수 있도록 루프의 하위 디렉터리를 계속 유지하려면 어떻게 해야 합니까? 즉, 파일 경로가 올바르지 않거나 누락되었기 때문에 하위 디렉터리 제거가 작동하지 않습니다.
즉, 다음 순서로 정렬해야 합니다.
subdirFoo/2019-05-02-blah.ext
subdirBar/2019-05-05-blah.ext
subdirBar/2019-05-13-blah.ext
subdirFoo/2019-06-01-blah.ext
subdirBar/2019-06-03-blah.ext
subdirFoo/2019-06-07-blah.ext
zsh의 솔루션이 선호되지만 bash나 sh도 괜찮습니다.
답변1
sort
필드 구분 기호를 /
두 번째 필드로 설정하고 정렬 해야 할 수 있습니다 .
답변2
그럴지는 모르겠지만옳은방법이지만 ${VAR##*/}
glob 한정자에 매개변수 대체를 채울 수 있습니다 zsh
oe
.
% printf '%s\n' subdir*/*(.Noe:'REPLY=${REPLY##*/}':)
subdirFoo/2019-05-02-blah.ext
subdirBar/2019-05-05-blah.ext
subdirBar/2019-05-13-blah.ext
subdirFoo/2019-06-01-blah.ext
subdirBar/2019-06-03-blah.ext
subdirFoo/2019-06-07-blah.ext
그러면 마지막 경로 구성 요소(파일 이름)를 기준으로 glob 결과가 정렬됩니다. glob 한정자의 비트는 :'...':
각 일치 항목에 대해 실행되고 정렬 키( 실제 일치 항목) REPLY
로 사용될 값으로 설정됩니다 .$REPLY
예를 들어글로벌 예선부분zsh: 14.7 파일 이름 확장자
oe 및 o+는 특별한 경우입니다. 각각 뒤에는 e glob 한정자와 + glob 한정자로 구분된 쉘 코드가 옵니다(위 참조). 항목의 파일 이름으로 설정된 REPLY 매개변수와 zsh_eval_context에 추가된 globsort를 사용하여 일치하는 각 파일에 대해 코드가 실행됩니다. 코드는 어떤 방식으로든 REPLY 매개변수를 수정해야 합니다. 반환 시 파일 이름 대신 인수 값을 정렬할 문자열로 사용합니다. 다른 정렬 연산자와 달리 oe 및 o+는 반복될 수 있지만 모든 glob 표현식에 나타날 수 있는 모든 유형의 정렬 연산자의 최대 개수는 12개입니다.
답변3
대신 glob을 사용하게 되었습니다 find
. 필드별 정렬에 대한 팁을 제공한 @ctrl-alt-delor에게 감사드립니다.
for file in `find {subdirFoo,subdirBar} -maxdepth 1 -name 'prefix*.ext' | sort -t / -k 2`; do echo $file; somecommand $file; done