폴더에 나타나는 대로 파일 이름 바꾸기

폴더에 나타나는 대로 파일 이름 바꾸기

컨텍스트는 다음과 같습니다.

삼바 서버에는 네트워크 스캐너로부터 파일을 수신하는 폴더(A,B,C,D라고 함)가 있습니다. 스캐너는 다음 이름의 PDF 파일을 렌더링합니다.

YYYYMMDDHHmmss.pdf

(년, 월, 일, 시, 분, 초)

이 PDF 파일이 폴더에 나타나는 대로 또는 1분 내에 이름을 바꿔야 합니다(crontab을 생각하고 있습니다).

이름 바꾸기는 다음과 같아야 합니다.

"[폴더별 접두사]_YYYY-MM-DD.pdf"

"date +%F"가 내가 원하는 타임스탬프를 수행하는 것을 확인했습니다. 스크립트에서 접두사를 수동으로 설정하기만 하면 됩니다.

내 마음 속에는 알고리즘이 있는데, 이런 것임에 틀림없어

 "-read file.pdf
    -if the name of the file doesn't have [prefix] 
     -then mv file.pdf [prefix]_[date].pdf
    -else nevermind about that file."

올바른 구문을 찾는 데 정말 어려움을 겪고 있습니다.

스캐너에서 생성된 파일 이름을 사용하는 대신 파일 생성의 시스템 타임스탬프를 검색하고 이를 사용하여 파일 이름을 바꾸는 것을 선호합니다.

답변1

다음은 이 유틸리티를 기반으로 구축된 솔루션입니다 inotifywait. (이것을 사용할 수도 있지만 incron이와 유사한 코드가 여전히 필요합니다.) 시작 시 이 코드를 실행합니다 /etc/rc.local.

#!/bin/bash
#
cd /path/to/samba/folder

# Rename received files to this prefix and suffix
prefix="some_prefix"
suffix="pdf"

inotifywait --event close_write --format "%f" --monitor . |
    while IFS= read -r file
    do
        # Seconds since the epoch
        s=$(stat -c "%Y" "$file")

        # Convert to YYYY-MM-DD
        ymd="$(date --date "@$s" +'%Y-%m-%d')"

        # Rename the file. Mind the assumed extension
        mv -f "$file" "${prefix}_$ymd.$suffix"
    done

같은 날 두 개 이상의 파일이 생성되면 어떤 일이 발생할 것으로 예상되는지 잘 모르겠습니다. 현재 가장 최근에 도착한(및 처리된) 파일은 동일한 날짜의 이전 파일을 대체합니다.

답변2

크론이 좋은 생각인 것 같아요! 다음은 스크립트에 대한 몇 가지 입력입니다.

#!/bin/bash
smbdir="/path/to/samba/folder"
smbsubdirs=(A B C D)
smbprefix="YOUR_PREFIX"  # for example

for dirname in ${smbsubdirs[@]}; do
  dir=$smbdir/$dirname && [ -d "$dir" ] || continue
  while read -r file; do
    if [[ "$(basename $file)" =~ ^([0-9]+[.]pdf)$ ]];
    then
      date=$(date +%Y%m%d%S -d $(stat -c%w $file))
      new="$dir/${smbprefix}_$date.pdf"
      echo "mv \"$file\" \"$new\""
      # mv "$file" "$new" # commented for testing
    fi
  done < <(find "$dir" -cnewer "$dir" -type f -iname *.pdf)
  touch $dir
done
exit 0

귀하의 시스템에서 inotify-tools를 사용할 수 없는 경우에만 이 솔루션을 권장합니다.

건배 대성당

관련 정보