Bashでファイルサイズを確認してファイルを削除する

Bashでファイルサイズを確認してファイルを削除する

ファイルを含む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つのパラメータを使用します。

その後、指定されたソースディレクトリのファイルを繰り返します。指定されたターゲットディレクトリに同じ名前のファイルがある場合は、stat2つのファイルのサイズを取得するために使用されます。サイズが一致すると、ソースファイルは削除されます。

ファイルを削除する前にメッセージを表示する-i(対話型)オプションが含まれています。rmこれにより、関心のあるアイテムを盲目的に削除する前に正しい操作を実行していることを確認できます。あなたの要件を満たしていて快適だと思われる場合は、削除することを選択できます-i

答え2

bashの代わりに買えるなら...

jdupes --delete --paramorder --recurse destination source

次に、一致するファイル(名前と内容)を見つけて、重複したエントリを削除します。このオプションを使用する場合は、引数の順序が重要です--paramorder。これは、削除時にリストの最初の重複エントリを保持し、ファイルをターゲットに保持しようとするためです。destination source--noprompt

バラよりjdupes のマニュアルページ

関連情報