Сравните файлы и переименуйте, если содержимое отличается

Мне нужно создать код, который будет:

  1. Проверьте два аргумента в начале минус само имя скрипта (например, dar /mnt/sdb1 /root/testdir/testarc с помощью $1 = /mnt/sdb1 и $2 = /root/testdir/testarc)
  2. Скопируйте все файлы с расширением .doc , .pdf и .PDF из исходного каталога sdb1 (и его подкаталогов) в каталог назначения
  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}" \; 

Вы можете использовать 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/" 
 cmp_or_rename() if ! cmp -- "$1" "${2?NEED TWO ARGS}" then ln -- "$1" "${1%.*}$((i+=1))${1#"${1%.*}"}" fi 

… это только делает жесткую ссылку, и я вроде бы уверен, что это источник, и который является dest, а также немного о том, почему … но если "$1" и "$2" не являются именами двух читаемых одинаковых файлов то "$1" привязывается к $1 - last ..* + (i++) + last ..* , или ln сообщит вам, почему нет.