我需要创建一个代码来:
- 检查开头处的两个参数减去脚本名称本身(即
dar /mnt/sdb1 /root/testdir/testarc
带有$1 = /mnt/sdb1
和$2 = /root/testdir/testarc)
- 将源目录(及其子目录)中所有带有
.doc
,.pdf
和文件扩展名的文件复制到目标目录.PDF
sdb1
- 使用某种类型的
cmp
命令(或者可能diff
?)来重命名在复制过程中可能具有相同名称但不同数据的任何文件 - 如果存在
.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
会让你知道为什么不。