次のタスクを実行するには、コードを作成する必要があります。
- 最初にスクリプト名自体を引いた2つの引数を確認します(例:
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ファイルが2回変更されると、最新の古いバージョンのみがバックアップとして使用されます(デフォルト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"
、同じ 2 つのファイルの名前でない場合は、"$1"
ハードリンクまたは$1 - last ..* + (i++) + last ..*
そうln
でない理由を教えてください。