내가 어떻게 할적절하게역순으로 반복 하시겠습니까 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
.
내 경고:tail
null로 끝나는 문자열을 잘 처리하지 못한다 는 것을 읽었습니다.. 이것은 Mac OS X에서는 잘 작동하지만 모든 *nix에 대해 보증할 수는 없습니다. 조심해서 진행해라.
나는 또한 그것을 언급해야한다GNU 병렬xargs
대안 으로 자주 사용됩니다 . 확인해 보실 수도 있습니다.
내가 뭔가를 놓친 것 같으니 다른 사람들도 참여해야 한다.