ファイルを含む2つのディレクトリがあります。一つは「ソース」、もう一つは「ターゲット」です。 「ソース」のファイルを確認するスクリプトが必要です。ファイル名とサイズが「ターゲット」のファイル名とサイズと一致する場合は、「ソース」のファイルを削除します。 bashを使用する方が良いです。
ブロックサイズを使用すると、比較するのに十分ですか?
次のように書きましたが、ファイルは印刷されませんでした。
#!/bin/bash
for file in $*; do
echo "$file"
# get size of regular files
[ -f "$file" ] && ls -l "$file"
done
答え1
このようなものが役に立ちます。いいえスペースを含むファイル/ディレクトリ名がサポートされています。
#!/bin/bash
readonly source_dir="${1}"
readonly destination_dir="${2}"
if [[ "${source_dir}" = "" ]] || [[ "${destination_dir}" = "" ]]; then
echo 1>&2 "usage ${0} <source_dir> <destination_dir>"
exit 1
fi
for source_file in $(cd "${source_dir}"; find . -type f); do
full_source="$(cd "${source_dir}" && readlink -f "${source_file}")"
if [[ -f "${destination_dir}/${source_file}" ]]; then
full_destination="$(cd "${destination_dir}" && readlink -f "${source_file}")"
source_size="$(stat --printf="%s" "${full_source}")"
destination_size="$(stat --printf="%s" "${full_destination}")"
if [[ "${source_size}" = "${destination_size}" ]]; then
rm -i "${full_source}"
fi
fi
done
スクリプトは、ソースディレクトリ名とターゲットディレクトリ名の2つのパラメータを使用します。
その後、指定されたソースディレクトリのファイルを繰り返します。指定されたターゲットディレクトリに同じ名前のファイルがある場合は、stat
2つのファイルのサイズを取得するために使用されます。サイズが一致すると、ソースファイルは削除されます。
ファイルを削除する前にメッセージを表示する-i
(対話型)オプションが含まれています。rm
これにより、関心のあるアイテムを盲目的に削除する前に正しい操作を実行していることを確認できます。あなたの要件を満たしていて快適だと思われる場合は、削除することを選択できます-i
。
答え2
bashの代わりに買えるなら...
jdupes --delete --paramorder --recurse destination source
次に、一致するファイル(名前と内容)を見つけて、重複したエントリを削除します。このオプションを使用する場合は、引数の順序が重要です--paramorder
。これは、削除時にリストの最初の重複エントリを保持し、ファイルをターゲットに保持しようとするためです。destination source
--noprompt
バラよりjdupes のマニュアルページ