Compare os arquivos e renomeie se o conteúdo diferir

3

Eu preciso criar um código que:

  1. Verifique se há dois argumentos no início menos o próprio nome do script (por exemplo,dar /mnt/sdb1 /root/testdir/testarc com $1 = /mnt/sdb1 e $2 = /root/testdir/testarc)
  2. Copie todos os arquivos com uma extensão de arquivo .doc , .pdf e .PDF do diretório de origem sdb1 (e seus subdiretórios) para o diretório de destino
  3. Use algum tipo de comando cmp (ou talvez diff ?) para renomear arquivos que tenham o mesmo nome, mas dados diferentes durante o processo de cópia
  4. Se houver um arquivo .PDF/.pdf com os mesmos dados que um arquivo .doc , o arquivo .PDF/.pdf não deve ser copiado, somente a versão .doc

Até agora eu consegui 1 e 2. 3 e 4 me deixaram perplexo.

Ignore o loop for , é inútil.

Aqui está o meu código fonte:

#!/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}" \;
    
por James Dean 08.11.2015 / 18:20

2 respostas

1

Você pode usar rsync com a opção --backup para fazer automaticamente backups de arquivos existentes no diretório de destino. Nota: isso só manterá uma cópia de backup - se o arquivo src for alterado duas vezes, você terá apenas a versão anterior mais recente como backup (renomeada para filename~ por padrão)

por exemplo. algo como:

#! /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/"  

Se você quisesse mais cópias de backup, poderia usar a opção --backup-dir . por exemplo,

#! /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/"  
    
por 08.11.2015 / 22:58
1
cmp_or_rename()
    if    ! cmp -- "$1" "${2?NEED TWO ARGS}"
    then  ln -- "$1" "${1%.*}$((i+=1))${1#"${1%.*}"}"
    fi

... que só faz um hardlink, e eu sou um pouco duvidoso sobre qual é a origem e qual é dest e também um pouco sobre o porquê ... mas se "$1" e "$2" não forem nomes de dois legíveis , arquivos idênticos, em seguida, "$1" é vinculado a $1 - last ..* + (i++) + last ..* ou ln informará por que não.

    
por 09.11.2015 / 11:59