Bash에서 파일 크기를 확인하여 파일 삭제

Bash에서 파일 크기를 확인하여 파일 삭제

파일이 포함된 두 개의 디렉토리가 있습니다. 하나는 "소스"이고 다른 하나는 "대상"입니다. "소스"의 파일을 확인하는 스크립트를 원합니다. 파일 이름 및 크기가 "대상"의 파일 이름 및 크기와 일치하면 "소스"의 파일을 삭제합니다. 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

스크립트는 소스 디렉터리 이름과 대상 디렉터리 이름이라는 두 가지 매개 변수를 사용합니다.

그런 다음 지정된 소스 디렉터리의 파일을 반복합니다. 지정된 대상 디렉터리에 동일한 이름의 파일이 있는 경우 stat두 파일의 크기를 가져오는 데 사용됩니다. 크기가 일치하면 소스 파일이 삭제됩니다.

파일을 삭제하기 전에 메시지를 표시하도록 -i(대화형) 옵션을 포함시켰습니다 . rm이렇게 하면 관심 있는 항목을 맹목적으로 삭제하기 전에 올바른 작업을 수행하고 있는지 확인할 수 있습니다. 귀하의 요구 사항을 충족하고 편안하다고 생각되면 삭제하도록 선택할 수 있습니다 -i.

답변2

bash 대안으로 살 수 있다면 ...

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

그러면 일치하는 파일(이름 및 내용)을 찾아 중복 항목을 제거합니다. 이 옵션을 사용하려는 경우 인수의 순서가 중요합니다 --paramorder. 삭제할 때 목록의 첫 번째 중복 항목을 유지하고 파일을 대상에 유지하려고 하기 때문입니다.destination source--noprompt

바라보다jdupes 매뉴얼 페이지

관련 정보