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