用硬链接替换重复文件的功能

时间:2015-04-12 03:53:41

标签: linux bash

我需要编写一个bash脚本来迭代指定目录的文件,并用硬链接替换重复的文件。

到目前为止,我已遍历文件并将文件名存储在数组中。

现在,我需要浏览该数组并检查每个文件是否有重复项。我用来执行此操作的相关代码如下:

#"files" is the array with all the file names
#"fileNum" is the size of the array

...

for((j=0; j<$fileNum; j++))             #for every file
do
    if [ -f "$files[$j]" ]          #access that file in the array
    then
        for((k=0; k<$fileNum; k++))     #for every other file
        do
            if [ -f "$files[$k]" ]      #access other files in the array
            then
                test[cmp -s ${files[$j]} ${files[$k]}]      #compare if the files are identical
                [ln ${files[$j]} ${files[$k]}]          #change second file to a hard link
            fi
...

测试目录有两个文件:a和b。 b是a。的副本。

运行脚本后,ls -l显示所有文件仍然只有1个硬链接,因此脚本似乎基本上什么也没做。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

首先,不要迭代所有文件两次,否则你会比较每对夫妇两次,你会比较一个文件与自己。其次,(( ))内不需要美元符号。最后,我认为您没有正确访问数组,因此[ -f ]总是失败,因此没有任何反应。请注意,这也需要更改第一个循环(使用[ -f ]时的数组表示法。

第二个循环应该是这样的:

for((k=j+1; k<fileNum; k++)); do
    if [ -f ${files["$k"]} ]; then
        cmp ${files["$j"]} ${files["$k"]}
        if [[ "$?" -eq 0 ]]; then
            rm  ${files["$k"]}
            ln ${files["$j"]} ${files["$k"]}
        fi
    fi
done

如果此处的cmp成功,则会创建一个链接。 cmp仅在文件不同时失败。尝试使用此代码,并在遇到任何问题时通知我。

可替换地:

for((k=j+1; k<fileNum; k++)); do
    if [ -f ${files["$k"]} ]; then
        cmp ${files["$j"]} ${files["$k"]} && ln -f ${files["$j"]} ${files["$k"]}
    fi
done