기본적으로 백업 파일을 생성하려면 코드가 필요합니다. 사양 중 하나는 파일( .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
경고 메시지가 울립니다. - 문제는 코드가 여전히 파일을 복사한다는 것입니다.
나는 이 두 파일을 찾으면 코드가 무엇을 해야 하는지 지정하지 않았기 때문에 이것이라고 생각합니다.
다음은 참조용으로만 사용되는 전체 코드입니다.
#!/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