我有两个包含文件的目录,一个是“源”,另一个是“目标”。我想要一个检查“源”中文件的脚本。如果文件名和大小与“目标”处的文件名和大小匹配,则删除“源”处的文件。最好使用 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