전송 스크립트

전송 스크립트

파일 쌍을 폴더로 전송하기 위한 스크립트가 필요합니다.

파일이 포함된 디렉토리 가 있습니다 .pdf. for everything .pdf.done(동일한 이름, 단지 다른 모드 pdf --> done)입니다.

문제는 어떤 경우에는 a가 .pdf존재하지 않거나 .donea가 .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

관련 정보