for 루프를 어떻게 뒤집나요?

for 루프를 어떻게 뒤집나요?

내가 어떻게 할적절하게역순으로 반복 하시겠습니까 for?

for f in /var/logs/foo*.log; do
    bar "$f"
done

파일 이름의 이상한 문자를 손상시키지 않는 솔루션이 필요합니다.

답변1

Bash 또는 ksh에서는 파일 이름을 배열에 넣고 역순으로 배열을 반복합니다.

files=(/var/logs/foo*.log)
for ((i=${#files[@]}-1; i>=0; i--)); do
  bar "${files[$i]}"
done

이 옵션을 설정하면 위 코드는 zsh ksh_arrays(ksh 에뮬레이션 모드)에서도 실행됩니다. zsh에는 glob 한정자를 통해 일치 순서를 바꾸는 더 쉬운 방법이 있습니다.

for f in /var/logs/foo*.log(On); do bar $f; done

POSIX에는 배열이 포함되어 있지 않으므로 이식성을 원한다면 문자열 배열을 직접 저장하는 유일한 옵션은 위치 인수입니다.

set -- /var/logs/foo*.log
i=$#
while [ $i -gt 0 ]; do
  eval "f=\${$i}"
  bar "$f"
  i=$((i-1))
done

답변2

개행 문자가 "유행 문자"라고 생각하지 않는 한 다음을 시도해 보세요.

ls /var/logs/foo*.log | tac | while read f; do
    bar "$f"
done

답변3

공백으로 구분된 문자열 목록을 역순으로 반복하는 방법을 알아내려는 사람이 있다면 다음과 같이 하면 됩니다.

reverse() {
  tac <(echo "$@" | tr ' ' '\n') | tr '\n' ' '
}

list="a bb ccc"

for i in `reverse $list`; do
  echo "$i"
done
> ccc
> bb 
> a

답변4

find /var/logs/ -name 'foo*.log' -print0 | tail -r | xargs -0 bar

원하는 방식으로 작동해야 합니다(이것은 Mac OS X에서 테스트되었으며 아래에 경고가 있습니다...).

찾은 매뉴얼 페이지에서 :

-print0
         This primary always evaluates to true.  It prints the pathname of the current file to standard output, followed by an ASCII NUL character (charac-
         ter code 0).

기본적으로 문자열 + glob과 일치하는 파일을 찾고 각 파일을 NUL 문자로 종료합니다. 파일 이름에 줄 바꿈이나 기타 이상한 문자가 포함되어 있으면 find가 이를 잘 처리해야 합니다.

tail -r

파이프를 통해 표준 입력을 얻고 이를 반대로 합니다( tail -r인쇄에 주의하세요).모두표준 기본값인 마지막 10줄뿐만 아니라 stdout에 입력합니다. man tail더 많은 정보를 알고 싶다면).

그런 다음 파이프로 연결합니다 xargs -0.

-0      Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and newlines.  This is expected to be used in concert with the
         -print0 function in find(1).

여기서 xargs는 from find및 reverse 에서 전달하는 NUL 문자로 구분된 인수를 볼 것으로 예상합니다 tail.

내 경고:tailnull로 끝나는 문자열을 잘 처리하지 못한다 는 것을 읽었습니다.. 이것은 Mac OS X에서는 잘 작동하지만 모든 *nix에 대해 보증할 수는 없습니다. 조심해서 진행해라.

나는 또한 그것을 언급해야한다GNU 병렬xargs대안 으로 자주 사용됩니다 . 확인해 보실 수도 있습니다.

내가 뭔가를 놓친 것 같으니 다른 사람들도 참여해야 한다.

관련 정보