我需要编写一个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个硬链接,因此脚本似乎基本上什么也没做。
我哪里错了?
答案 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