编辑:

编辑:

本质上我需要创建一个备份文件的代码。其中一项规范是,如果存在一个文件(例如,.pdf我们称之为文件)和一个具有完全相同名称 ( ) 的文件,则代码仅复制该文件。test1.pdf.doctest1.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 运行脚本时,这个循环正在做什么:

  1. 检查是否有任何文件.pdf
  2. 删除前面的名称.
  3. 检查之前是否有任何其他具有相同文件名的文件.,如果是.doc文件,则会回显警告消息
  4. 问题是,代码仍然复制文件

我怀疑这是因为我没有指定代码如果找到这两个文件应该做什么。

这是我的完整代码,仅供参考。

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

相关内容