我已经为我的点文件创建了一个管理器,该管理器在dot_files /目录中的每个点文件和$ HOME之间创建了符号链接。
我正在尝试编写一个脚本,删除所有这些特定的符号链接,而不删除其他任何符号。
这是我的O(n ^ 2)解决方案,可以很好地完成工作。
delete_sym_links () {
# Include dot (.) files while looping
shopt -s dotglob
for DOT_FILE in ~/dot_files/*;
do
if [ ! -d "$DOT_FILE" ];
then
for FILE in ~/*;
do
if [ -h "$FILE" ] && [ $(basename $DOT_FILE) = $(basename $FILE) ];
then
rm "$FILE"
echo deleted "$FILE"
fi
done
fi
done
}
我正在尝试将运行时降低到O(n lg n)。打击确实使我震惊。
就像是...
delete_sym_links () {
SYM_LINKS=($(find $HOME -maxdepth 1 -type l -ls | sort -n))
NUM_SYM_LINKS=$(find $HOME -maxdepth 1 -type l -ls | wc -l)
DOT_FILES=$(find $HOME/dot_files/ -maxdepth 1 -name ".*" -type f | sort -n)
NUM_DOT_FILES=$(find $HOME/dot_files/ -maxdepth 1 -name ".*" -type f | wc -l)
i=0
j=0
while (("$i" < "$NUM_SYM_LINKS")) && (("$j" < "$NUM_DOT_FILES"));
do
if [ $(basename ${SYM_LINKS[$i]}) = $(basename ${DOT_FILES[$j]}) ];
then
echo removing sym link ${SYM_LINKS[$i]}
rm ${SYM_LINKS[$i]}
((j++))
else
((i++))
fi
done
echo "All dot_files sym links removed"
}
试试这个Shellcheck -clean,O(n),代码:
function delete_symlinks
{
local df_path df_name home_df_path
for df_path in ~/dot_files/.* ; do
[[ -d $df_path ]] && continue
df_name=${df_path##*/}
home_df_path=~/$df_name
if [[ -L $home_df_path ]] ; then
rm -- "$home_df_path"
printf 'deleted %s\n' "$home_df_path"
fi
done
return 0
}
[[
代替[
测试。请参见Bash中的双方括号[[]]是否优于单方括号[]?${var##*/}
用于代替$(basename $var)
安全性和速度。请参阅删除字符串的一部分(BashFAQ / 100(如何在bash中进行字符串处理?))。printf
用于代替echo
安全。请参阅对为什么printf比echo更好的公认且出色的答案。。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句