文件出现在文件夹中时对其进行重命名

文件出现在文件夹中时对其进行重命名

这是上下文:

在 samba 服务器上,我有一些文件夹(我们称之为 A、B、C、D ),它们应该从网络扫描仪接收文件。扫描仪呈现一个 PDF 文件,其名称如下:

YYYYMMDDHHmmss.pdf

(年、月、日、时、分、秒)

我需要在这些 PDF 文件出现在文件夹中时或在一分钟内(我正在考虑 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

我认为 cron 是个好主意!这里是您的脚本的一些输入:

#!/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,我只会推荐此解决方案。

干杯大教堂

相关内容