найдите 2 файла с похожими именами и переместите их в новое место

найдите 2 файла с похожими именами и переместите их в новое место

У меня есть система с папкой наблюдения, куда люди/компании могут загружать новые файлы через FTP или SMB. В этой папке наблюдения они ВСЕГДА должны загружать 2 файла: 1 медиафайл с префиксом имени ABC*.mxfи всегда номером для '*'. Другой файл имеет то же имя, но с расширением .xml.

пример: загруженные файлы: ABC0001.mxf, ABC0001.xml

Если загружен второй файл ABC0002.xml, но ABC0002.mxf еще не загружен или не завершен, файл ABC0002.xml пока НЕ ​​следует перемещать. Только если оба файла ABC*.mxf и ABC*.xml имеют совпадающие имена и им 5 минут или больше, их следует перемещать.

Мне нужно создать скрипт, который находит эти 2 одинаковых файла (по имени, а не по расширению) и перемещает их только если время изменения (mmin) старше 5 минут. Таким образом, перемещаются только завершенные файлы.

Также я должен сказать, что несколько файлов могут быть загружены одновременно разными поставщиками. ABC0001.mxf + .xml компанией 1, ABC0100.mxf + .xml компанией 2 и ABC1003.mxf + .xml компанией 3. Не все они завершаются в одно и то же время.

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


SOURCEDIR="/dir/to/source"
DESTDIR="/destination/dir"

for FOUND in `find $SOURCEDIR/AutoIngest -maxdepth 1 \
    -type f -name ^ABC* -mmin +5 `;     
do     
    mv "$FOUND" "$DESTDIR/"    
done

EDIT: изменил имена файлов с ABC* на ABC*.mxf, потому что медиафайл всегда имеет расширение .mxf. И добавил пример загрузки файла.

решение1

Самый простой подход будет зависеть от того, насколько вы доверяете своим пользователям. Если вам не нужно проверять, что оба файла существуют или что имена верны или что-то в этом роде, вам даже не нужен скрипт. Вы можете сделать это с помощью простого find:

find /dir/to/source -name "ABC*" -mmin +5 -exec mv {} /destination/dir \;

Если вам нужно убедиться, что i) оба файла присутствуют и ii) оба имеют время изменения не менее 5 минут назад, в системе GNU вы можете сделать следующее:

#!/usr/bin/env bash

SOURCEDIR="/dir/to/source"
DESTDIR="/destination/dir"

for f in "${SOURCEDIR}"/*.xml; do
    ## Make sure the file exists and is a regular file (or symlink to regular file),
    ## and that its modification date is at least 5 minutes ago
    [ -f "$f" ] && [ "$(( $(date +%s) - $(stat -c %Y "$f") ))" -ge 300 ] || continue

    ## Do the same for a file of the same name but with the .mxf extension.
    mxf="${SOURCEDIR}/$(basename "$f" .xml).mxf";
    [ -f "$mxf" ] && [ "$(( $(date +%s) - $(stat -c %Y "$no_ext") ))" -ge 300 ] || continue

    ## We will only get to this point if all of the above tests were successful
    echo mv -v "$f" "$mxf" "$DESTDIR"
done

решение2

В системе GNU:

SOURCEDIR="/dir/to/source"
DESTDIR="/destination/dir"
TIMESTAMP_MINDIFF=300

timestamp="$(date +%s)"
find "$SOURCEDIR/AutoIngest" -maxdepth 1 -type f -name 'ABC*' ! -name '*.xml' |
  while IFS= read -r file; do
    xmlfile="${file}.xml"
    test -f "$xmlfile" || continue
    ts_file="$(date --reference="$file" +%s)"
    ts_xmlfile="$(date --reference="$xmlfile" +%s)"
    if [ "$((timestamp-ts_file))" -gt "$TIMESTAMP_MINDIFF" ] &&
       [ "$((timestamp-ts_xmlfile))" -gt "$TIMESTAMP_MINDIFF" ]; then
      echo mv "$file" "$xmlfile" "$DESTDIR/"
    fi
  done

Удалите, echoесли вывод соответствует желаемому.

решение3

С zsh:

cd /dir/to/source || exit
files=(ABC*(N.mm+5))
for f ($files[(k)*.xml]) {
   (($files[(I)$f:r])) && print -r mv -v -- $f $f:r /destination/dir/
}

(уберите print -rif happy).

Или чтобы не звонить mvнесколько раз:

cd /dir/to/source || exit
files=(ABC*(N.mm+5))
tomove=()
for f ($files[(k)*.xml]) {
   (($files[(I)$f:r])) && tomove+=($f $f:r)
}
print -r mv -- $tomove /destination/dir/

Связанный контент