파일을 비교하고 내용이 다른 경우 이름을 바꿉니다.

파일을 비교하고 내용이 다른 경우 이름을 바꿉니다.

다음 작업을 수행하려면 코드를 만들어야 합니다.

  1. 처음에 스크립트 이름 자체를 뺀 두 인수를 확인합니다(예: dar /mnt/sdb1 /root/testdir/testarcwith $1 = /mnt/sdb1$2 = /root/testdir/testarc)
  2. 소스 디렉터리(및 하위 디렉터리)에 있는 .doc, .pdf및 파일 확장자를 가진 모든 파일을 대상 디렉터리에 복사합니다..PDFsdb1
  3. 복사 프로세스 중에 이름은 같지만 데이터가 다를 수 있는 파일의 이름을 바꾸려면 일부 유형의 cmp명령(또는 가능합니까 ?)을 사용하십시오.diff
  4. .PDF/.pdf파일과 동일한 데이터가 있는 파일이 있는 경우 .doc해당 파일은 복사되지 않고 버전만 복사됩니다..PDF/.pdf.doc

지금까지 1과 2를 해봤습니다. 3과 4는 어리둥절합니다.

루프를 무시하면 for아무 소용이 없습니다.

이것은 내 소스 코드입니다.

#!/bin/bash
sourcePath=$1
destPath=$2
Filedoc="*.doc"
Filepdf="*.pdf"
FilePDF="*.PDF"

if [[ $# -ne 2 ]]; then
    echo "Usage ; dar doc_path archive_path"
    exit 1
fi

if [ ! -d sourcePath ]
    then echo Directory does not exist
fi

if [ ! -d destPath ]
    then mkdir -p $destPath
fi

for file in $(find "${sourcePath}" -type f -exec basename {} \; | sort | uniq -d); do
  num=1 
  fileName=$(echo "${file}" | cut -d '.' -f1)
  fileExtension=$(echo "${file}" | cut -d '.' -f2)
  dirName=$(dirname "${duplicate}")
  for duplicate in $(find "${sourcePath}" -name "${file}" | tail -n +2 ); do
    mv "${duplicate}" "${duplicate}${fileName}_${num}.${fileExtension}"
    echo "Renamed duplicate file ${duplicate} ${duplicate}_${num}.${fileExtension}"
    (( num = num + 1 ))
  done
done

for file in $(find "${sourcePath}" -name "*.pdf"); do
  fileName=$(echo "${file}" | cut -d '.' -f1)
  if $(find $(sourcePath) -name "${fileName}.doc" &>/dev/nulll; then
    echo "Sorry, a .doc file with that extension already exists, skipping copy"
    continue
  fi
done

find "${sourcePath}" -name "$Filedoc" -exec cp -r {} "${destPath}" \;
find "${sourcePath}" -name "$Filepdf" -exec cp -r {} "${destPath}" \;
find "${sourcePath}" -name "$FilePDF" -exec cp -r {} "${destPath}" \;

답변1

rsync이 옵션을 사용하여 --backup대상 디렉터리에 있는 파일을 자동으로 백업할 수 있습니다. 참고: 이렇게 하면 백업 복사본만 보관됩니다. src 파일이 두 번 변경되면 최신 이전 버전만 백업으로 사용됩니다( filename~기본적으로 이름이 변경됨).

예를 들어:

#! /bin/bash

src="$1"
dst="$2"

# comment out the next line when you are sure it does what you want.
# And then try it with a trial destination dir a few times before
# running it with your real destination.
dryrun="--dry-run"

rsync $dryrun -avu --stats --progress --backup "$src" --include '**.doc' \
--include '**.pdf' --include '**.PDF' --exclude '**' "$dst/"  

더 많은 백업 복사본이 필요한 경우 이 --backup-dir옵션을 사용할 수 있습니다. 예를 들어

#! /bin/bash

src="$1"
dst="$2"

dryrun="--dry-run"

BD=$(date '+%Y%m%d-%H%M%S')

rsync $dryrun -avu --stats --progress --backup --backup-dir="./$BD/" "$src" \
    --include '**.doc' --include '**.pdf' --include '**.PDF' \
    --exclude '**' "$dst/"  

답변2

cmp_or_rename()
    if    ! cmp -- "$1" "${2?NEED TWO ARGS}"
    then  ln -- "$1" "${1%.*}$((i+=1))${1#"${1%.*}"}"
    fi

...이것은 단지 하드 링크를 생성할 뿐이며 어느 것이 소스이고 어느 것이 대상인지, 그리고 그 이유가 조금 확실하지 않습니다. 하지만 및 가 "$1"읽을 수 "$2"있고 동일한 두 파일의 이름이 아닌 경우 "$1"에 대한 하드 링크 $1 - last ..* + (i++) + last ..*또는 ln그렇지 않은 이유를 알려주십시오.

관련 정보