사람들/회사가 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/