파일 이름의 리디렉션 및 줄 번호

파일 이름의 리디렉션 및 줄 번호

다음 줄 수로 파일 이름을 지정하려고합니다 crontab.

* * * * * ~/script > "~/targetfile-$(rows-count).csv"

저 할 수 있어요:

* * * * * ~/script > "~/targetfile-$(~/script | wc -l).csv"

하지만 스크립트를 두 번 실행하는 것보다 더 잘할 수 있다고 생각합니다.

도와주세요? 감사해요

답변1

여기에서 해석 명령줄을 cron사용 하고 다음을 수행하도록 지시할 수 있습니다 .zsh

SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ mv -- $1 ~/targetfile-$(($(wc -l < $1))).csv; } =(~/script)

즉, =(...)프로세스 대체를 사용하여 스크립트의 출력을 임시 파일( 단순히 이름을 바꾸는 ~것이 아니라 숨겨진 파일로 )에 저장하는 경우 여기서는 이름을 대상 파일 이름으로 바꾸는 익명 함수에 매개변수로 전달됩니다./tmpmv

또는 스크립트 출력을 임시 파일에 제공할 수도 있습니다 wc -l.

SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ ~/script >&1 > $1 | wc -l | read n; mv -- $1 ~/targetfile-$n.csv; } =(:)

답변2

스크립트의 출력을 임시 파일에 쓰고, 파일의 줄 수를 계산하고, 파일을 새 이름으로 이동합니다.

t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$len.csv"

GNU를 사용하지 않는 경우 에서 wc값의 시작이나 끝 부분에 공백 문자가 나타날 수 있습니다 $len. 그런 다음 삭제해야 합니다.

t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$(( len + 0 )).csv"

여기서는 한 번만 실행 하고 출력의 줄 수를 계산하는 동안(데이터 복사 덕분에 ) "$HOME/script"출력을 임시 파일( )에 저장합니다 . 그러면 임시 파일이 새 이름으로 이동됩니다.$ttee

아마도 내 crontab에서 전체 목록을 예약하는 대신 별도의 스크립트에 넣고 예약할 것입니다.

스크립트는 다음과 같습니다.

#!/bin/sh

tmpfile=$(mktemp) &&
length=$("$HOME/script" | tee -- "$tmpfile" | wc -l) &&
mv -- "$tmpfile" "$HOME/targetfile-$(( length + 0 )).csv"

관련 정보