디렉터리의 최신 파일이 이전 파일과 다른지 비교합니다.

디렉터리의 최신 파일이 이전 파일과 다른지 비교합니다.

다음 스크립트가 있습니다.

#!/bin/bash
y=$(ls -t ./pics/0/*.png | head -n 2 | tail -n 1)
new=$(ls -t ./pics/0/*.png | head -n 1)
while true
do
 if cmp --silent "$y" "$new" ; then
y=$(ls -t ./pics/0/*.png | head -n 1)
    base64 $y | tr -d '\n' | sed '$ a \'
new=$(ls -t ./pics/0/*.png | head -n 1)
 fi
done

내가 뭘 잘못했나요? 명확하게 말하면, 내 목표는 최신 파일이 이전 최신 파일과 다른지, 그리고 고유한 BASE64를 STDOUT으로 생성하는 경우에만 비교하는 것입니다(즉, 한 번만 인쇄해야 함을 의미).

답변1

다음 코드 조각은 공백, 탭 또는 줄 바꿈이 포함된 파일 이름에는 작동하지 않습니다.

find여기에 사용된 - 명령 에 대한 자세한 내용은 다음 을 참조하세요.https://unix.stackexchange.com/a/240424/364705

#!/bin/bash
lastrun=''
while true; do
  read -r newer older <<< \
    $(find . -type f -exec stat -c '%Y %n' {} \; \
    | sort -nr \
    | awk 'NR==1,NR==2 {print $2}'\
    | xargs )

  if [ "$newer" == "$lastrun" ]; then
    :
  else
    if ! cmp "$newer" "$older" > /dev/null ; then
      base64 "$newer"| tr -d '\n' | sed '$ a \'
      lastrun="$newer"
    fi
  fi
done

그리고 사용된 솔루션은 다음과 같습니다 inotify-wait.

#!/bin/bash
lastfile=''
inotifywait -m /path/to/somewhere -e close -e moved_to |
while read path action file; do
  if [ "$lastfile" != '' ];then
    if ! cmp "${path}$file" "${path}${lastfile}" > /dev/null  ; then
    base64 "${path}${file}"
    fi
  fi
    lastfile="$file"
done

관련 정보