다음 작업을 수행하려면 코드를 만들어야 합니다.
- 처음에 스크립트 이름 자체를 뺀 두 인수를 확인합니다(예:
dar /mnt/sdb1 /root/testdir/testarc
with$1 = /mnt/sdb1
및$2 = /root/testdir/testarc)
- 소스 디렉터리(및 하위 디렉터리)에 있는
.doc
,.pdf
및 파일 확장자를 가진 모든 파일을 대상 디렉터리에 복사합니다..PDF
sdb1
- 복사 프로세스 중에 이름은 같지만 데이터가 다를 수 있는 파일의 이름을 바꾸려면 일부 유형의
cmp
명령(또는 가능합니까 ?)을 사용하십시오.diff
.PDF/.pdf
파일과 동일한 데이터가 있는 파일이 있는 경우.doc
해당 파일은 복사되지 않고 버전만 복사됩니다..PDF/.pdf
.doc
지금까지 1과 2를 해봤습니다. 3과 4는 어리둥절합니다.
루프를 무시하면 for
아무 소용이 없습니다.
이것은 내 소스 코드입니다.
#!/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}" \;
find "${sourcePath}" -name "$FilePDF" -exec cp -r {} "${destPath}" \;
답변1
rsync
이 옵션을 사용하여 --backup
대상 디렉터리에 있는 파일을 자동으로 백업할 수 있습니다. 참고: 이렇게 하면 백업 복사본만 보관됩니다. src 파일이 두 번 변경되면 최신 이전 버전만 백업으로 사용됩니다( filename~
기본적으로 이름이 변경됨).
예를 들어:
#! /bin/bash
src="$1"
dst="$2"
# comment out the next line when you are sure it does what you want.
# And then try it with a trial destination dir a few times before
# running it with your real destination.
dryrun="--dry-run"
rsync $dryrun -avu --stats --progress --backup "$src" --include '**.doc' \
--include '**.pdf' --include '**.PDF' --exclude '**' "$dst/"
더 많은 백업 복사본이 필요한 경우 이 --backup-dir
옵션을 사용할 수 있습니다. 예를 들어
#! /bin/bash
src="$1"
dst="$2"
dryrun="--dry-run"
BD=$(date '+%Y%m%d-%H%M%S')
rsync $dryrun -avu --stats --progress --backup --backup-dir="./$BD/" "$src" \
--include '**.doc' --include '**.pdf' --include '**.PDF' \
--exclude '**' "$dst/"
답변2
cmp_or_rename()
if ! cmp -- "$1" "${2?NEED TWO ARGS}"
then ln -- "$1" "${1%.*}$((i+=1))${1#"${1%.*}"}"
fi
...이것은 단지 하드 링크를 생성할 뿐이며 어느 것이 소스이고 어느 것이 대상인지, 그리고 그 이유가 조금 확실하지 않습니다. 하지만 및 가 "$1"
읽을 수 "$2"
있고 동일한 두 파일의 이름이 아닌 경우 "$1"
에 대한 하드 링크 $1 - last ..* + (i++) + last ..*
또는 ln
그렇지 않은 이유를 알려주십시오.