比较文件并重命名(如果内容不同)

比较文件并重命名(如果内容不同)

我需要创建一个代码来:

  1. 检查开头处的两个参数减去脚本名称本身(即dar /mnt/sdb1 /root/testdir/testarc带有$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会让你知道为什么不。

相关内容