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