CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·주식한당 ·아이포니앙 ·MaClien ·일본산당 ·방탄소년당 ·자전거당 ·개발한당 ·소시당 ·이륜차당 ·안드로메당 ·나스당 ·AI당 ·육아당 ·영화본당 ·골프당 ·가상화폐당 ·클다방 ·디아블로당 ·사과시계당 ·걸그룹당 ·리눅서당 ·소셜게임한당 ·젬워한당 ·노젓는당 ·패스오브엑자일당 ·IoT당 ·창업한당 ·노키앙 ·축구당 ·윈폰이당 ·캠핑간당 ·라즈베리파이당 ·패셔니앙 ·여행을떠난당 ·맛있겠당 ·물고기당 ·바다건너당 ·3D메이킹 ·X세대당 ·ADHD당 ·AI그림당 ·날아간당 ·배드민턴당 ·야구당 ·농구당 ·블랙베리당 ·곰돌이당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·활자중독당 ·볼링친당 ·냐옹이당 ·문명하셨당 ·클래시앙 ·콘솔한당 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·뚝딱뚝당 ·개판이당 ·동숲한당 ·날아올랑 ·전기자전거당 ·e북본당 ·갖고다닌당 ·이브한당 ·도시어부당 ·FM한당 ·포뮬러당 ·안경쓴당 ·차턴당 ·총쏜당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·KARA당 ·키보드당 ·꼬들한당 ·덕질한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·MTG한당 ·소리당 ·적는당 ·방송한당 ·PC튜닝한당 ·찰칵찍당 ·그림그린당 ·소풍간당 ·심는당 ·품앱이당 ·리듬탄당 ·달린당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·퐁당퐁당 ·테니스친당 ·테스트당 ·빨콩이당 ·공대시계당 ·터치패드당 ·트윗당 ·VR당 ·시계찬당 ·WebOs당 ·위스키당 ·와인마신당 ·WOW당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

리눅서당

리눅서수다 하루에 파일 하나를 랜덤하게 선택하는데 같은걸 두번 하지는 않는 bash script? 14

2020-10-03 16:12:49 60.♡.127.180
건설노무자

안녕하세요

pi에 다음과 같은 bash script를 작성해서 하루에 한번씩 실행시킬 생각입니다

잘못된 형식의 이미지 링크입니다.



스크립트는 일차로 new디렉토리를 검색해서 파일이 있으면 무조건 날짜순으로 선택해서 실행해준다음 arc디렉토리로 옮겨주고요, 

new디렉토리가 비었으면 arc에서 랜덤하게 파일을 선택해서 실행합니다

눈치채신 분도 계시겠지만 전자액자를 어떻게 구현해볼까 하고 있습니다

며칠간 테스트해본 결과 최근 사진 위주로 잘 보여주고 최근사진이 다 떨어지면 지난 사진들을 랜덤하게 보여줘서 만족스런 편입니다

하나 문제는 arc에 있는 파일을 보여줄 경우 이게 랜덤이다보니 가끔 동일한 사진이 두번 연속으로 올라오는 경우가 있습니다

사진이 하루에 한번씩 바뀌는 컨셉인데 이틀 연속으로 같은게 올라오니 좀 그렇습니다

무슨 좋은 방법이 없을까요?

건설노무자 님의 게시글 댓글
SIGNATURE
호주이민19년차입니다
https://www.youtube.com/user/nomuza1/videos
서명 더 보기 서명 가리기
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [14]
예쁜닉네임
IP 222.♡.79.246
10-03 2020-10-03 17:40:42 / 수정일: 2020-10-03 19:44:47
·
깊이 생각해보지 않았지만... find 와 touch 로 해결할 수 있을 것 같네요. touch 명령어로 파일의 타임스템프를 바꿀 수 있습니다. find 명령으로 타임스템프가 지금보다 지정된 시간 이내 또는 이외의 파일을 검색할 수 있습니다.

1. find 명령으로 현재보다 얼마간 이전에 수정/변경된 파일의 목록을 구한다. (파일이 하나도 없으면 시간범위를 조정한다.)
2. 파일 목록의 순서를 섞는다.
3. 파일을 보여준다.
4. touch 명령으로 파일의 수정/변경 시간을 바꾼다.
5. 목록에 파일 이름을 제거하고 3으로 간다.

정도면 될 것 같네요.

추가: 한 번 아래 코드를 시험해 보세요. (혹시... 잘 안될지도 몰라서요...) echo 문이 원하는대로 출력되면 명령으로 바꾸고요^^

cd /home/pi/Pictures

while true; do
NEW="$(find new -mindepth 1)"
ARC="$(find arc -mindepth 1 -mtime +1 | shuf)"
[ -z "${NEW}" ] && [ -z "${ARC}" ] && break

for file in ${NEW}; do
echo fbi -T 7 -d /dev/fb0 -noverbose -autozoom ${file}
echo mosquitto_pub -h 192.168.1.200 -p 1883 -t 'pictureFrame/filename' -m "$(basename ${file})"
echo touch ${file}
echo mv ${file} arc
echo sleep 1d
done

for file in ${ARC}; do
[ "$(ls -A new)" ] && break
echo fbi -T 7 -d /dev/fb0 -noverbose -autozoom ${file}
echo mosquitto_pub -h 192.168.1.200 -p 1883 -t 'pictureFrame/filename' -m "$(basename ${file})"
echo touch ${file}
echo sleep 1d
done
done
건설노무자
IP 60.♡.127.180
10-03 2020-10-03 22:27:17
·
@예쁜닉네임님
감사합니다! 스크립트가 아름답네요~
테스트삼아 에코를 다 지우고 sleep 1d를 1m으로 줄여서 실행시켜봤는데요
이게 한 사이클이 다 돌아가면 그냥 끝나버리네요
(테스트 폴더에는 이미지파일이 9개가 있는데 무슨 이유에선지 8개만 보여주고 종료해버립니다)
그리고 그 이후로는 실행시켜도 아무런 반응이 없습니다
저는 crontab으로 스크립트를 매일 아침에 한번 실행하게 했었는데,
위의 스크립트에서 sleep 1d만 없애고 크론으로 돌리면 뭐가 달라질까요?
예쁜닉네임
IP 222.♡.79.246
10-04 2020-10-04 01:23:18 / 수정일: 2020-10-04 02:08:02
·
@건설노무자님 "그 이후로는 실행시켜도 아무런 반응이 없습니다"는 find arc -mindepth 1 -mtime +1 때문일거에요. 이게... touch 한 다음 하루 이상 지난 파일만 찾거든요. "8개만 보여주고 종료해버립니다"는 잘 모르겠네요. 아직 하루가 지나지 않은 파일이 있었다면 정상인 것이고, 아니라면 버그가 있는 것일텐데요TT.

"크론으로 돌리면 뭐가 달라질까요?" 이건... while true; do 줄과 맨 밑의 done 줄 사이의 내용을 무한 반복하는 코드에요^^. 또... NEW 와 ARC 도 한 개의 파일이 아니라 파일 목록이고요, for 문으로 반복하고 있어요. ARC 반복마다 new 디렉터리에 새 파일이 있는지 검사해서 break 하는 부분이 있고요, break 되면 while 반복으로 돌아가 새로운 NEW 반복을 하는 구조에요.

크론으로 돌린다면 중복 실행이 될 수 있겠네요TT. 조금 더 신경쓴다면... 스크립트의 내용을 실행하기 전에 같은 이름의 프로세스를 검사해서 이미 실행되고 있다면 즉각 종료하는 부분을 넣어주고, 시스템 기동시 런레벨의 서비스로 동작하도록 만들 것을 생각하고 있었던 것이거든요^^. 물론, 조금 더 다듬어야 되지만요. 만일 크론으로 돌린다면...

cd /home/pi/Pictures

FILE="$(find new -mindepth 1 | sort | head -n 1)"
DEST="arc"
if [ -z "${FILE}" ]; then
FILE="$(find ${DEST} -mindepth 1 -mtime +1 | shuf -n 1)"
DEST=""
fi

if [ "${FILE}" ]; then
fbi -T 7 -d /dev/fb0 -noverbose -autozoom ${FILE}
mosquitto_pub -h 192.168.1.200 -p 1883 -t 'pictureFrame/filename' -m "$(basename ${FILE})"
touch ${FILE}
[ "${DEST}" ] && mv ${FILE} ${DEST}
fi

정도로 바꾸면 한 개의 파일만 대상으로 한 번만 실행할거에요. 아... 머리 속으로만 짠 거라 시험을 해봐야해요^^.
건설노무자
IP 60.♡.127.180
10-04 2020-10-04 08:10:55
·
@예쁜닉네임님
이제 조금 이해가 가는군요 ㅎㅎ
8개만 실행됐던건 아마 new디렉토리내에 파일갯수와 관련이 있는것 같습니다. 스크립트가 new를 다 써버리면 종료되는것 같아요.
(테스트를 위해서 1분으로 시간간격을 줄였으니 find arc -mindepth 1 -mtime +1도 이에 맞게 고쳐 봐야 할까요?)
그리고 크론을 사용하는 이유는 fbi가 제 파이zw에서 좀 많이 불안정하드라구요... 테스트로 한 열번 연속 고해상도 이미지를 연속로딩하고 나면 무슨 이유에선지 뻗어버리더군요.
어차피 혼자쓰는 파이고 전자액자 외에 별 다른 특별한 기능을 하는게 아니라서 그냥 단순히 매일 새벽에 자동 리붓 시키고 크론으로 부팅후 30초 딜레이했다가 스크립트 실행하면 간단할 것 같아서였습니다. 이런 방식이면 말씀하신 프로세스 중복문제도 걱정할 게 없구요
어쨌든 touch로 파일시간을 변경시키는 방식이 제게는 아주 신박해서 이걸로 성공했으면 좋겠군요
죽창깎는청년
IP 116.♡.80.70
10-03 2020-10-03 23:41:58 / 수정일: 2020-10-03 23:42:23
·
음 제가 생각한게 맞을 지 모르겠는데,
arc 디렉토리에서 랜덤하게 선택된 파일명을 어디다 써두고(특정 파일에 기록?),
써둔 걸 읽어서 선택된 파일 명과 비교해서 같으면 한 번 더 랜덤하게 고르도록 하면 안될까요?
건설노무자
IP 60.♡.127.180
10-04 2020-10-04 08:15:40
·
@죽창깎는청년님
그것도 방법중 하나네요
일단 위의 예쁜닉네임님 방식이 별도 임시파일도 필요없고 깔끔해보여서 일단 그 방식 시도해보구요
초보수준에서 과하게 복잡해지면(!) 이방식도 검토해보겠습니다
예쁜닉네임
IP 222.♡.79.246
10-04 2020-10-04 09:38:35 / 수정일: 2020-10-04 10:11:52
·
@건설노무자님 이런 방법도 있겠군요.

1. 디렉터리를 3개 만든다. (new, todo, done)
2. new 와 todo 가 모두 비어있으면, todo 디렉터리를 지우고 done 의 이름을 todo 로 바꾼다. 새로운 디렉터리 done 을 만든다. (기존 done 은 todo 로 이름이 바뀌었으니까...)
3. new 디렉터리에 파일이 있으면... new 디렉터리에서 파일을 하나 골라 그 파일을 처리하고, 해당 파일을 done 디렉터리로 mv 한다. new 디렉터리에 파일이 없으면... todo 디렉터리에서 파일을 하나 골라 그 파일을 처리하고, 해당 파일을 done 디렉터리로 mv 한다.

cd /home/pi/Pictures

FILE="$(find new -mindepth 1 | sort | head -n 1)"
if [ -z "${FILE}" ]; then
FILE="$(find todo -mindepth 1 | shuf -n 1)"
[ "${FILE}" ] || rmdir todo || mv done todo || mkdir done || FILE="$(find todo -mindepth 1 | shuf -n 1)"
fi

if [ "${FILE}" ]; then
fbi -T 7 -d /dev/fb0 -noverbose -autozoom ${FILE}
mosquitto_pub -h 192.168.1.200 -p 1883 -t 'pictureFrame/filename' -m "$(basename ${FILE})"
mv ${FILE} done
fi

정도 될 것 같네요. 역시... 시험은 해보지 않았지만요.
건설노무자
IP 60.♡.127.180
10-04 2020-10-04 09:57:29
·
@예쁜닉네임님 천재세요? ㅋ
옛날옛적 산수/수학시간에 '주머니에서 공을 꺼내서 색깔을 확인하고 다시 집어넣기/ 안 집어넣기' 확률 계산하던거랑 비슷하네요
결국 중복을 피하려면 주머니에 따로 담기만 하면 되니까 이게 젤 간단한 방법이겠군요
주머니가 비면 샥! 바꿔서 계속 돌려주면 되구요
여러 아이디어들 정말 감사합니다. 저는 주로 하드웨어/3D DIY가 취미인데 이런 초보 프로그래밍도 재미 차원에서 나쁘지않군요!
예쁜닉네임
IP 222.♡.79.246
10-04 2020-10-04 10:10:48
·
@건설노무자님 아... 저도 재미있었답니다^^
건설노무자
IP 60.♡.127.180
10-04 2020-10-04 08:26:47
·
그리고 이건 여담인데요
스크립트초반에 #!/bin/bash라는건 도대체 무슨 역할인걸까요?
인터넷으로 검색해보면 다들 저것부터 달고 시작해서 필수인줄 알았는데
위의 예쁜닉네임님 스크립트는 그것 없이도 잘만 돌아가는군요
예쁜닉네임
IP 222.♡.79.246
10-04 2020-10-04 09:15:41
·
@건설노무자님 우선... find 의 -mtime 옵션은 날짜단위에요. 날짜보다 더 작은 단위를 쓰려면 -mmin 옵션을 쓰세요. 이건 분단위거든요. 다음에 나오는 숫자는 +숫자 나 -숫자가 올 수 있어요. +n 은 n 보다 큰 이란 뜻이고, -n 은 n 보다 작은 이란 뜻이에요. 자세한 것은 man find 를 보세요^^.

다음으로... #!/bin/bash 라는 첫 줄은 https://ko.wikipedia.org/wiki/셔뱅 이라고 불러요. 어떤 해석기로 스크립트를 실행할 것인가를 명시적으로 지정해주는 것이고요. 지정하지 않으면 SHELL 환경변수로 지정되어있는 (대부분의 경우 /bin/bash 일테지만) 쉘로 해석할거에요. 이건, 명시적으로 지정하는 것이 좋아요. 이 경우는 본 쉘 스크립트지만... 스크립트라는 것이 본 쉘 스크립트만 있는 것은 아니거든요. 예를 들어, perl 이란 언어로 스크립트를 짤 수도 있겠죠. python 이란 언어로 짤 수도 있고요.
jys129
IP 115.♡.146.20
10-04 2020-10-04 18:21:59
·
@건설노무자님
최근에는 bash말고 다른 shell을 쓰는 경우가 많아서 (fish나 zsh)
스크립트에 명시하는 것이 좋습니다.
죽창깎는청년
IP 116.♡.80.70
10-04 2020-10-04 22:52:23 / 수정일: 2020-10-04 22:52:41
·
@건설노무자님 쉘 스크립트 종류마다 문법도 조금씩 다른것 같더라고요..
bigzero
IP 211.♡.114.80
10-20 2020-10-20 15:18:01
·
어제 본 파일을 arc 폴더에 파일명으로 저장하면 될듯 합니다...

if(arc.count !=1 && arc.count !=0) {
// 어제 본 파일명 뺀것들중 랜덤 선택
}
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.