Renomeando um arquivo no momento em que aparece em uma pasta

2

Este é o contexto:

em um servidor samba, tenho algumas pastas (que chamaremos A, B, C, D) que devem receber arquivos de um scanner de rede. O scanner renderiza um arquivo PDF com o seguinte nome:

YYYYMMDDHHmmss.pdf

(ano, mês, dia, hora, minuto, segundos)

Eu preciso que esses PDFs sejam renomeados no momento em que aparecem na pasta ou dentro do minuto (estou pensando em crontab).

a renomeação deve ser algo como

"[prefix_specific_to_the_folder]_YYYY-MM-DD.pdf"

Eu vi que "date +% F" faz o que eu quero para o timestamp, e eu só tenho que definir manualmente o meu prefixo no script.

Eu tenho o algoritmo em mente, deve ser algo como

 "-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."

É muito difícil encontrar a sintaxe correta para isso.

Eu preferiria recuperar o timestamp do sistema de criação de arquivo e renomear o arquivo com ele em vez de usar o nome do arquivo gerado pelo scanner.

    
por Slartibartfast 02.02.2016 / 16:00

2 respostas

5

Aqui está uma solução criada em torno do utilitário inotifywait . (Você poderia usar incron também, mas ainda precisaria de um código semelhante a este.) Execute isso no momento da inicialização, por exemplo, de /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

Não sei o que você espera que aconteça se houver dois ou mais arquivos criados no mesmo dia. No momento, o mais recente (e processado) substituirá qualquer arquivo anterior da mesma data.

    
por 02.02.2016 / 17:06
0

Acho que o cron é uma boa ideia! Aqui alguma entrada para o seu script:

#!/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

Eu só recomendaria esta solução se você não tiver ferramentas de inotificação disponíveis no seu sistema.

felicidades dom

    
por 02.02.2016 / 16:46