同じ名前の2つのファイルを見つけて新しい場所に移動します。

同じ名前の2つのファイルを見つけて新しい場所に移動します。

人々/会社がFTPまたはSMBを介して新しいファイルをアップロードできる監視フォルダがあるシステムがあります。この監視フォルダには常に2つのファイルをアップロードする必要があります。つまり、名前の前にABC*.mxf「*」が付いて常に数字が付くメディアファイル1つです。もう一つは、ファイル名は同じですが、.xml拡張子があります。

例:アップロードされたファイルはABC0001.mxf、ABC0001.xmlです。

2番目のファイルABC0002.xmlがアップロードされたがABC0002.mxfがまだアップロードされていないか完了していない場合は、ABC0002.xmlファイルを移動しないでください。 ABC * .mxfとABC * .xmlは、両方とも名前が一致し、長さが5分以上の場合にのみ移動する必要があります。

この2つの同じファイル(拡張子ではなく名前で)を見つけて、修正時間(mmin)が5分より古い場合にのみ移動するスクリプトを作成する必要があります。したがって、完了したファイルのみが移動されます。

また、複数のプロバイダが複数のファイルを同時にアップロードできることをお伝えしたいと思います。会社1はABC0001.mxf+.xmlを生成し、会社2はABC0100.mxf+.xmlを生成し、会社3はABC1003.mxf+.xmlを生成します。すべてが同時に完了するわけではありません。

私は部分スクリプトを使い始めましたが、名前の部分を一致させるのに苦労しています。


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

編集:メディアファイルの拡張子は常に.mxfなので、ファイル名をABC *からABC * .mxfに変更しました。そして、ファイルアップロードの例を追加しました。

答え1

最も簡単な方法は、ユーザーを信頼する方法によって異なります。これら2つのファイルが存在するか、名前が正しいかなどをテストする必要がない限り、スクリプトも必要ありません。簡単な操作でこれを行うことができます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 -r)。

または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/

関連情報