이름이 비슷한 파일 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 \;

GNU 시스템에서 i) 두 파일이 모두 있고 ii) 둘 다 수정 시간이 최소 5분 전인지 확인해야 하는 경우 다음을 수행할 수 있습니다.

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

관련 정보