Intereting Posts

Переименование файла в тот момент, когда он отображается в папке

Вот контекст:

на сервере samba у меня есть несколько папок (которые мы будем называть A, B, C, D), которые должны получать файлы из сетевого сканера. Сканер отображает файл PDF, названный так:

YYYYMMDDHHmmss.pdf

(Год, Месяц, День, Час, минута, секунды)

Мне нужны эти PDF-файлы для переименования в тот момент, когда они появляются в папке, или в течение минуты (я думаю о crontab).

переименование должно быть что-то вроде

"[Prefix_specific_to_the_folder] _YYYY-ММ-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." 

Мне очень сложно найти правильный синтаксис для этого.

Я бы предпочел получить системную метку времени создания файла и переименовать файл с ним вместо использования имени файла, сгенерированного сканером.

Вот решение, построенное вокруг утилиты 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 

Я не уверен, что вы ожидаете, если в тот же день создаются два или более файлов. На данный момент последний (и обработанный) заменит любой более ранний файл с той же даты.

Я думаю, что cron – хорошая идея! Вот некоторые данные для вашего скрипта:

 #!/bin/bash smbdir="@sambadir@" # change the @sambadir@ variable by hand smbsubdirs=(ABCD) smbprefix="@sambaprefix@" # for example for sd in ${smbsubdirs[@]}; do ssd=$smbdir/$sd && [ -d "$ssd" ] || continue for f in $(find $ssd -cnewer $ssd -type f); do if [[ "$(basename $f)" =~ ^([0-9]{8}).*[.]pdf$ ]]; then fd=$(date +%F -d ${BASH_REMATCH[1]}) nf="$(dirname $f)/${smbprefix}_${fd}.pdf" echo "mv \"$f\" \"$nf\"" # mv "$f" "$nf" # disabled for testing fi; done; touch $ssd done; exit 0 

Надеюсь, это поможет, я написал его с нуля, а не проверял. Пожалуйста, дайте мне знать о ваших результатах. Cheers dom