파일 쌍을 폴더로 전송하기 위한 스크립트가 필요합니다.
파일이 포함된 디렉토리 가 있습니다 .pdf
. for everything .pdf
은 .done
(동일한 이름, 단지 다른 모드 pdf --> done
)입니다.
문제는 어떤 경우에는 a가 .pdf
존재하지 않거나 .done
a가 .done
없다는 것입니다 .pdf
. 이 경우 스크립트는 해당 특정 파일 쌍을 무시하고 다음 파일을 가져와야 합니다.
다 옮기고 싶다쌍이 스크립트를 사용하여 파일을 다른 폴더에 복사합니다. 그러나 페어링되지 않은 파일은 이동되지 않습니다.
스크립트를 만들었지만 이 경우 비교하고 건너뛰는 방법을 모르겠습니다.
#!/bin/bash
# source directory where all files are
SOURCE_DIR=/var/xms/batch/PDF/
# Name of directory you want to move the PDFs to.
DEST_DIR=/var/xms/batch/PDF/put_ready/
# Create the destination directory for the moved PDFs, if it doesn't already exist.
[ ! -d $DEST_DIR ] && mkdir -p $DEST_DIR
# Search for .done files starting in $SOURCE_DIR
find $SOURCE_DIR -type f -name "*.done" | while read fin
do
# Try to Find the specific PDF which names the Pattern
fpdf=?????
# If a file with .pdf extension exists, move the .done file to the destination dir.
# In the event of a file name clash in the destination dir, the incoming file has
# a number appended to its name to prevent overwritng of the existing files.
[ -f "$fpdf" ] && mv -v --backup=numbered "$fin" $DEST_DIR/
done
##
## End of script.
##
답변1
가지고 있는 것에 몇 가지만 변경하면 됩니다. 주요 변경 사항은 와일드카드를 사용하여 파일을 찾고 매개변수를 확장하여 파일 경로와 확장자의 일부를 구분하는 것입니다. 일치하는 항목이 없을 때 FOUND_FILE 값이 null이 되도록 nullglob 옵션을 활성화합니다. for 루프의 전역 일치로 인해 완성 파일이 존재한다는 것을 알고 있으므로 일치하는 pdf가 있는지 확인할 수 있습니다. 그렇다면 PDF 또는 완성된 파일이 대상 디렉토리에 이미 존재하는지 확인하십시오. 충돌이 발생하면 에포크 타임스탬프를 파일 접미사로 사용합니다. 새 파일 이름이 존재할 가능성은 여전히 희박하므로 완벽하지는 않습니다. 이것이 실제 문제인지 다시 확인할 수 있습니다.
#!/bin/bash
# source directory where all files are
SOURCE_DIR=/var/xms/batch/PDF
# Name of directory you want to move the PDFs to.
DEST_DIR=/var/xms/batch/PDF/put_ready
# Create the destination directory for the moved PDFs, if it doesn't already exist.
[ ! -d "$DEST_DIR" ] && mkdir -p "$DEST_DIR"
# Enable nullglob in the event of no matches
shopt -s nullglob
# Search for .done files starting in $SOURCE_DIR
for FOUND_FILE in "$SOURCE_DIR"/*.done
do
# Get root file path without extension
FILE_ROOT="${FOUND_FILE%%.*}"
# Is there a .pdf to go with the .done file
if [ -f "${FILE_ROOT}.pdf" ]
then
# Do either of these files exist in the DEST_DIR
if [ -f "$DEST_DIR/${FILE_ROOT##*/}.pdf" ] || [ -f "$DEST_DIR/${FILE_ROOT##*/}.done" ]
then
# Use epoch stamp as unique suffix
FILE_SFX="$(date +%s)"
## You could still have a file conflict is the DEST_DIR and
## maybe you consider checking first or modifying the move command
# Move the file pairs and add the new suffix
mv "${FILE_ROOT}.done" "$DEST_DIR/${FILE_ROOT##*/}_${FILE_SFX}.done"
mv "${FILE_ROOT}.pdf" "$DEST_DIR/${FILE_ROOT##*/}_${FILE_SFX}.pdf"
else
# Move the file pairs
mv "${FILE_ROOT}.done" "$DEST_DIR/${FILE_ROOT##*/}.done"
mv "${FILE_ROOT}.pdf" "$DEST_DIR/${FILE_ROOT##*/}.pdf"
fi
fi
done
##
## End of script.
##
답변2
이 시도:
for FILE in $(ls $SOURCE_DIR/*.done); do NAME=${FILE::-4}; mv ${NAME}pdf $DEST_DIR 2>/dev/null && mv $FILE $DEST_DIR; done