編集する:

編集する:

デフォルトでは、バックアップファイルを生成するにはコードが必要です。仕様の 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

おすすめ記事