Bash 在Unix中删除重复文件
我希望能够删除重复文件,同时创建指向已删除重复行的符号链接。到目前为止,我可以显示重复文件,问题是删除和删除。因为我希望保留副本Bash 在Unix中删除重复文件,bash,shell,Bash,Shell,我希望能够删除重复文件,同时创建指向已删除重复行的符号链接。到目前为止,我可以显示重复文件,问题是删除和删除。因为我希望保留副本 find "$@" -type f -print0 | xargs -0 -n1 md5sum | sort --key=1,32 | uniq -w 32 -d --all-repeated=separate 输出: 1463b527b1e7ed9ed8ef6aa953e9ee81 ./tope5final 1463b527b1e7ed9ed8ef6aa95
find "$@" -type f -print0 | xargs -0 -n1 md5sum | sort --key=1,32 | uniq -w
32 -d --all-repeated=separate
输出:
1463b527b1e7ed9ed8ef6aa953e9ee81 ./tope5final
1463b527b1e7ed9ed8ef6aa953e9ee81 ./Tests/tope5
2a6dfec6f96c20f2c2d47f6b07e4eb2f ./tope3final
2a6dfec6f96c20f2c2d47f6b07e4eb2f ./Tests/tope3
5baa4812f4a0838dbc283475feda542a ./tope1bfinal
5baa4812f4a0838dbc283475feda542a ./Tests/tope1b
69d7799197049b64f8675ed4500df76c ./tope3afinal
69d7799197049b64f8675ed4500df76c ./Tests/tope3a
945fe30c545fc0d7dc2d1cb279cf9c04 ./Tests/butter6
945fe30c545fc0d7dc2d1cb279cf9c04 ./Tests/tope6
98340fa2af27c79da7efb75ae7c01ac6 ./tope2cfinal
98340fa2af27c79da7efb75ae7c01ac6 ./Tests/tope2c
d15df73b8eaf1cd237ce96d58dc18041 ./tope1afinal
d15df73b8eaf1cd237ce96d58dc18041 ./Tests/tope1a
d5ce8f291a81c1e025d63885297d4b56 ./tope4final
d5ce8f291a81c1e025d63885297d4b56 ./Tests/tope4
ebde372904d6d2d3b73d2baf9ac16547 ./tope1cfinal
ebde372904d6d2d3b73d2baf9ac16547 ./Tests/tope1c
例如,在本例中,我希望删除./tope1cfinal并保留./Tests/tope1c。删除后,我还想创建一个名为/tope1cfinal指向/Tests/tope1c的符号链接。一种可能性:创建一个关联数组,其键是md5sum,其字段是找到的第一个文件(不会被删除的文件)。每次在此关联数组中找到md5sum时,都会删除该文件,并创建指向相应键的相应链接(检查要删除的文件是否为原始文件后)。将要搜索的目录作为参数;在没有参数的情况下,搜索在当前目录中执行
#!/bin/bash
shopt -s globstar nullglob
(($#==0)) && set .
declare -A md5sum=() || exit 1;
while(($#)); do
[[ $1 ]] || continue
for file in "$1"/**/*; do
[[ -f $file ]] || continue
h=$(md5sum < "$file") || continue
read h _ <<< "$h" # This line is optional: to remove the hyphen in the md5sm
if [[ ${md5sum[$h]} ]]; then
# already seen this md5sum
[[ "$file" -ef "${md5sum[$h]}" ]] && continue # prevent unwanted removal!
rm -- "$file" || continue
ln -rs -- "${md5sum[$h]}" "$file"
else
# first time seeing this file
md5sum[$h]=$file
fi
done
shift
done
#/bin/bash
shopt-s globstar nullglob
($#==0))&&set。
声明-A md5sum=()| |退出1;
而(元),;做
[$1]| |继续
以“$1”/**/*格式存档;做
[[-f$file]]| |继续
h=$(md5sum<“$file”)|继续
读h_1。为什么要删除tope1cfinal
而不是Test/tope1c
?2.为什么要符号链接而不是硬链接?(这两个问题在某种程度上是相关的:硬链接会使过程更加对称)。符号链接将指向原始文件。由于一些程序仍然希望访问原始删除文件,因此符号链接就足够了。这并不能解释为什么您更喜欢符号链接而不是硬链接。这并不能回答问题1。链接可能会跨越不同的文件系统。因此,如果要删除,我只想保留一份副本,任何一个都可以删除,但必须保留一个链接才能用于ln-r的正确保存。不存在-r开关。@Alexander:这可能取决于您使用的ln
的版本。很高兴它有帮助!