
コンテキストは次のとおりです。
Sambaサーバーには、ネットワークスキャナからファイルを受信するフォルダ(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が利用できない場合にのみ、このソリューションをお勧めします。
乾杯大聖堂