명령이 실행될 때 파일 이름이 증가하고 그 사이에 일시 중지됩니다.

명령이 실행될 때 파일 이름이 증가하고 그 사이에 일시 중지됩니다.

내 파일 이름에 숫자 증가 접미사가 있습니다.

filename01
filename02
.
.
.
filename250

다음 cat 명령을 실행하기 전에 일시 중지할 수 있는 명령을 실행할 수 있기를 원합니다.

cat filename01
wait (1sec)
cat filename02
wait (1sec)
.
.
.
.
cat filename250

도와주세요. 내 마지막 파일 이름(filename250)은 더 높은 접미사를 가질 수 있습니다. 변수 설정을 사용하여 for 루프를 수행할 수 있는지 또는 공유하는 경우 더 나은 제안을 제공해주세요. 감사합니다!

답변1

이러한 파일을 숫자로 정렬하려면 zsh대신 사용하는 것이 좋습니다 bash.n숫자 전역 정렬 글로벌 예선그런 이유로. glob 확장 filename250과 같이 이것이 없으면 기본 glob 정렬 순서가 어휘이기 때문에 및 사이에서 정렬 filename*하게 됩니다 .filename25filename26

for file in filename<1-250>(Nn); do
  cat < $file
  sleep 1
done

( N일치하는 파일이 없는 경우 오류를 방지하기 위해 ulllglob 한정자를 사용할 수도 있습니다.)

임의의 숫자(1개 이상의 ASCII 10진수 시퀀스) <1-250>와 일치하거나 모든 항목과 일치하는 것으로 바꿉니다 .<->*

각 파일 사이에 1초를 기다리지 않고 매초마다 하나의 파일을 캡처합니다 (그리고 파일에 걸리는 시간도 cat고려하세요 ).cat

typeset -F SECONDS=0
n=0
for file in filename<1-250>(Nn); do
  cat < $file
  (( SECONDS >= ++n )) || sleep $(( n - SECONDS ))
done

(이것은 a가 sleep부동 소수점 숫자를 취할 수 있다고 가정합니다).

bash최신 GNU 시스템 에서는 비슷한 작업을 수행할 수 있습니다.

shopt -s nullglob extglob
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }

readarray -td '' files <(
  print0 filename+([0123456789]) |
    LC_ALL=C sort -zV
)
for file in "${files[@]}"; do
  cat < "$file"
  sleep 1
done

우리는 C 언어 환경에서 sortGNU 버전 정렬을 사용하여 zsh의 umericglobsort glob 한정자와 유사한 작업을 V수행합니다 .n

( bashksh 플레이버도 있지만 ksh93이나 zsh와 달리 앵커 포인트 $SECONDS가 될 수 없습니다 )typeset F

관련 정보