如何一次性删除损坏的符号链接?

如何一次性删除损坏的符号链接?

我已经创建了指向大量日志文件的符号链接。日志文件的语法是yyyymmdd.log.gz.

为了简化事情,我使用一个简单的序列,而不用以下命令解析它date

for dd in $(seq -w 20150101 20151231) ; do 
     ln -s $origin/$dd.log.gz $target/$dd.log.gz
done

如何一次性删除我刚刚创建的所有损坏的符号链接?

答案1

这个简单的单行代码很快就能完成这项工作。这个需要GNU 查找工具

find . -xtype l -delete

一点解释:

-xtype l测试损坏的链接(与 相反-type

-delete 直接删除文件,无需进一步麻烦xargs-exec

注意:-xtype l 表示 -xtype小写L(如关联) ;)

答案2

find -L /path -type l -exec rm -i {} \;

使用-Lfind尝试遵循符号链接来评估-type测试。如果成功跟踪链接,则该链接为不是损坏,并且-type l测试将是错误的(因为它是针对链接解析的内容进行评估的)。如果无法跟随链接,则链接已损坏并且测试-type l将为真。

如果-type l测试成功,则会-exec rm {} \;删除断开的链接。

建议使用-xtype lGNUism,主要针对 Linux 用户,并且不适用于非 GNU UNIX 系统,如 Solaris、FreeBSD 等。

答案3

With (您实际上在代码中zsh使用语法;with ,您需要引用这些变量):zshbash

rm -- $target/*(-@)

或者:

rm -- $target/<20150101-20151231>.log.gz(-@)

*(@)匹配文件类型符号链接*(-@)是那些仍然是类型的符号链接符号链接解析后(即无法解析符号链接目标的那些)。这相当于 GNUfind-xtype l.

zshGNU 中ln,您宁愿将循环编写为:

ln -srt $target -- $origin/<20150101-20151231>.log.gz

即使$origin包含相对路径(并创建相对符号链接,这也可以降低符号链接被破坏的风险,如果起源(与目标) 以后会更名)。

答案4

如果所有损坏的链接都是由错误命令在给定的时间戳创建的,那么下面的效果很好。

ls -lrt | grep "Sep 17 15:06" | awk '{print $9}' | xargs \rm

相关内容