編集する:

編集する:

デフォルトでは、バックアップファイルを生成するにはコードが必要です。仕様の 1 つは、ファイル (.pdfたとえば file と呼ぶ) とまったく同じ名前のファイル ( ) がある場合、コードはそのファイルのみをコピーすることです。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. 問題は、コードがまだファイルをコピーしていることです。

私はこれらの2つのファイルを見つけたら、コードが何をすべきかを指定していないので、これだと思います。

以下は参照用にのみ使用される完全なコードです。

#!/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ファイルのみをコピーし、存在しない場合はpdfをコピーします。

次に、すべての文書ファイルを再コピーします(これにより、バックアップPDFファイルなしですべての文書ファイルを取得できます)。

編集する:

以下は、私が意味するものを示す擬似コードの例です。

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

関連情報