
컨텍스트는 다음과 같습니다.
삼바 서버에는 네트워크 스캐너로부터 파일을 수신하는 폴더(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를 사용할 수 없는 경우에만 이 솔루션을 권장합니다.
건배 대성당