이름이 비슷한 파일 2개를 찾아서 새 위치로 이동하세요.

이름이 비슷한 파일 2개를 찾아서 새 위치로 이동하세요.

사람들/회사가 FTP 또는 SMB를 통해 새 파일을 업로드할 수 있는 감시 폴더가 있는 시스템이 있습니다. 이 감시 폴더에는 항상 2개의 파일을 업로드해야 합니다. 즉, 이름 앞에 ABC*.mxf"*"가 붙고 항상 숫자가 붙는 미디어 파일 1개입니다. 다른 하나는 파일 이름은 동일하지만 .xml확장자가 있습니다.

예: 업로드된 파일은 ABC0001.mxf, ABC0001.xml입니다.

두 번째 파일 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

가장 쉬운 방법은 사용자를 얼마나 신뢰하는지에 따라 다릅니다. 이 두 파일이 존재하는지, 이름이 올바른지 등을 테스트할 필요가 없다면 스크립트도 필요하지 않습니다. 간단한 작업으로 이를 수행할 수 있습니다 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/

관련 정보