다음 줄 수로 파일 이름을 지정하려고합니다 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)
즉, =(...)
프로세스 대체를 사용하여 스크립트의 출력을 임시 파일( 단순히 이름을 바꾸는 ~
것이 아니라 숨겨진 파일로 )에 저장하는 경우 여기서는 이름을 대상 파일 이름으로 바꾸는 익명 함수에 매개변수로 전달됩니다./tmp
mv
또는 스크립트 출력을 임시 파일에 제공할 수도 있습니다 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"
출력을 임시 파일( )에 저장합니다 . 그러면 임시 파일이 새 이름으로 이동됩니다.$t
tee
아마도 내 crontab에서 전체 목록을 예약하는 대신 별도의 스크립트에 넣고 예약할 것입니다.
스크립트는 다음과 같습니다.
#!/bin/sh
tmpfile=$(mktemp) &&
length=$("$HOME/script" | tee -- "$tmpfile" | wc -l) &&
mv -- "$tmpfile" "$HOME/targetfile-$(( length + 0 )).csv"