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