![编辑:](https://linux22.com/image/76955/%E7%BC%96%E8%BE%91%EF%BC%9A.png)
本质上我需要创建一个备份文件的代码。其中一项规范是,如果存在一个文件(例如,.pdf
我们称之为文件)和一个具有完全相同名称 ( ) 的文件,则代码仅复制该文件。test1.pdf
.doc
test1.doc
.doc
这是我到目前为止所得到的,除了这个最终要求之外,代码完成了 90% 的预期任务。我使用了 for 循环:
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
我相信人们会立即发现为什么它不起作用(我就是那么糟糕),但本质上,当我通过 bash -x 运行脚本时,这个循环正在做什么:
- 检查是否有任何文件
.pdf
- 删除前面的名称
.
- 检查之前是否有任何其他具有相同文件名的文件
.
,如果是.doc
文件,则会回显警告消息 - 问题是,代码仍然复制文件
我怀疑这是因为我没有指定代码如果找到这两个文件应该做什么。
这是我的完整代码,仅供参考。
#!/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}" \;
答案1
cd -P -- "$destpath" &&
cd -P -- "$sourcepath" || exit; d= \
find . -type f -name \*.pdf -exec sh -c '
for f
do [ -e "${f%.*}.doc" ]||
! case ${f#"$d"} in
*/*) d=${f%/*}/
mkdir -p "$0/$d" ;:
esac || cp "$f" "$0/$f"
done' "$OLDPWD" {} +
pax -rws"|.*\.pdf$||" . "$OLDPWD"
...它首先单独复制所有与其他文件名称不同的.pdf
文件,然后一次复制整个树,同时仅排除文件。"$sourcepath"
"$destpath"
.doc
.pdf
答案2
不要试图作弊你的作业。
我的做法是:首先(循环)搜索所有pdf文件,提取每个文件的文件名,然后检查同一路径中是否存在相应的doc文件。如果doc存在,则仅复制doc文件,如果不存在,则复制pdf。
之后重新复制所有 doc 文件(这将确保您获得没有备份 pdf 文件的所有 doc 文件)。
编辑:
这是我的意思的伪代码示例:
sourcePath=$1
destinationPath=$2
for all pdf files in $sourcePath; do
crt_file_without_extension
if crt_file_without_extension.doc exists
copy doc file to $destinationPath
else
copy pdf file to $destinationPath
fi
done
copy all doc files to $destinationPath